题目链接:https://ac.nowcoder.com/acm/contest/910/E
题目大意:
思路: 该题的大体意思是用w的0次方、w一次方……w n次方的砝码称出所给物体的重量,每个砝码都是唯一的不可重复使用。天平两侧都可放置砝码,以例一分析:要想称出7,需在7的那一侧放一个3,在天平另一侧放一个9和1,即可称出7的重量。
分析:该题可转化为一道w进制相关的题,模拟一下天平可得到如下式子:a0w0+a1*w1+……+anw^n=m,其中的a0-an均为0,1,-1(即该天平放在右侧),若满足条件即可判断。于是可以对式子进行逐次除以w后取余即可依次得到a0、a1等的值,由于取模不可能得到负值所以取模后的结果只能为0,1,w-1,这一点理解较困难,举例:若w=5,天平左侧放物体,右侧放砝码,若左侧放了一个5的砝码,那么整理式子至式子一端为m时,a1应为-1,但不满足运算法则,所以5的高次即5的平方次a2需要降一位给低位,那么a1的即为w-1=4,反过来求取a2的时候需要加一后取余。这一点相当于先将左侧的砝码拿走后又将左侧砝码加上。理解这一点不难写出代码。重复过程直至被除数为0或者存在不符合情况的余数输出NO即可。以上为解题分析。
测试中可以发现w等于1、2、3此题中可以构成任何数。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod = 332748118;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int w, m;
scanf("%d%d",&w,&m);
if(w<=3)
{
printf("YES\n");
}
else
{
int flog=0;
while(m)
{
int x=m%w;
if(x==0||x==1)
{
m/=w;
}
else if(x==w-1)
{
m=m/w+1;
}
else
{
flog=1;
break;
}
}
if(flog)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
}
return 0;
}