好题。
如果答案为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;
else
break;
}
if(m==1)
printf("YES\n");
else
printf("NO\n");
}
}