51nod 1449 砝码称重

来源:互联网 发布:知乎 避孕套 父母 编辑:程序博客网 时间:2024/05/02 06:13

好题。

如果答案为YES,则m可以表示为:

m=a[0]*w^0+a[1]*w^1+……

如果等号左右两边同时减去a[0]*w^0,即1、-1或者0,等号右边必然是w的倍数,也就是说,等号左边也必然是w的倍数。

也就是说,如果m、m-1或者m+1其中有一个为w的倍数,那么才能使得等式成立。(必要不充分条件)

等式左右两边同时消除a[0]*w^0的影响,再同除w,那么就变成了一个新的等式

m'=a[1]*w^0+a[2]*w^1+……

那么又回到了一开始,重新判断m'、m'-1或者m'+1其中是否有w的倍数。

循环结束的终止条件是m==1(或者m==0),如果中途存在m、m-1或者m+1没有一个是w的倍数的情况,则答案为NO。

#include<bits/stdc++.h>using namespace std;int main(){long long w,m;while(cin>>w>>m){while(m!=1){if(m%w==0)m/=w;else if((m+1)%w==0)m=(m+1)/w;else if((m-1)%w==0)m=(m-1)/w;elsebreak;}if(m==1)printf("YES\n");elseprintf("NO\n");}}


0 0
原创粉丝点击