Chieh's Blog

Because Of Coding

R308 DIV2 C. Vanya and Scales

Chieh posted @ 2015年6月19日 15:58 in codeforces , 273 阅读

飞机票:http://codeforces.com/contest/552/problem/C

题意:给你w和m,然后用w0.w1.w2......w100,放在天平两侧,且m肯定要放,w可以用完,但是每个只有一个,使得天平平衡。

分析:数学题,我们假设有个数组ai,且长度为0~100,且ai对应w0.w1.w2......w100其中,ai可以为1,0,-1,我们现在的目标就很明确了a0*w0+a1*w1+a2*w2......a100*w100=m如果ai为1的话,就是说指数为i的要放在天平与m相反的盘子里,如果是0,就是这个数不用用,如果是1,就是放在与m相同的地方。然后我们可以提取这些数的最大公约数,则有w0(a0+a1*w1/w0+a2*w2/w0...... )=m

从这个公式我们可以推出,m必须要可以整除w0,因为不能整除就是NO了,然后就剩下(a0+a1*w1/w0+a2*w2/w0...... )=m/w0 ,把a0移过来(a1*w1/w0+a2*w2/w0...... )=m/w0 +a0 则左边可以用前面的方法继续迭代,右边的话a0有三种可能,且如果这三种可能没有一种可以使得右边整除左边的最大公约数,则也是NO,因为w>2,所以这三种可能做多就一种满足。然后当右边=1的时候就结束,因为左边和右边一样了,YES。然后啪啪啪,就可以AC了

/*
Author:Chieh
Because Of Coding
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#define LL long long
#define INF 1e9
#define EPS 1e-9
using namespace std;
int w,m;
void init(){

}
void play(){
    int t=0;
    while(1){
        if(m==1){
            printf("YES\n");
            return;
        }
        if(m%w!=0){
            if((m+1)%w==0){
                m=m+1;
                m/=w;
            }
            else if((m-1)%w==0){
                m=m-1;
                m/=w;
            }
        }
        else{
            m/=w;
        }
        t++;
        if(t==101){
            printf("NO\n");
            return;
        }
    }
}
int main()
{
    while(scanf("%d%d",&w,&m)!=EOF){
        init();
        play();
    }
//    cout << "Hello world!" << endl;
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter