R308 DIV2 C. Vanya and Scales
Chieh
posted @ 2015年6月19日 15:58
in codeforces
, 285 阅读
飞机票: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; }