题目链接:
题目大意:
这道题给出一个数w,获取它所有的w,w^1,w^2.....,然后给出m,求解 a1*w + a2*w^2 +....... = m ,ai的取值为0,-1,1
题目分析:
首先如果不考虑-1的情况的话,那么ai的取值是1,0,所以我们可以联想到数制转换,然后看每一位是否是0或者1,如果不是,那么减去w,看是不是-1,然后向更高位进位,维护w进制数的合法性,因为该位在不合法情况下只可能调整为-1,所以这种方案能够覆盖所有情况,判断只要出现不能调整的不合法情况就可以判断当前w,m没有可行解
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 1200
using namespace std;
int num[MAX];
int w,m,cnt;
int main ( )
{
while ( ~scanf ( "%d%d" , &w , &m ) )
{
cnt = 0;
while ( m )
{
num[cnt++] = m%w;
m /= w;
}
bool flag = true;
for ( int i = 0 ; i < cnt ; i++ )
{
if ( num[i] == 0 || num[i] == 1 ) continue;
if ( num[i] - w == -1 )
{
num[i+1]++;
int id = i+1;
while ( num[id] >= w )
{
num[id] -= w;
num[id+1]++;
cnt = max ( cnt , id+1 );
id++;
}
continue;
}
flag = false;
}
if ( flag ) puts ("YES");
else puts ("NO");
}
}