现在有好多种砝码,他们的重量是 w0,w1,w2,... w0,w1,w2,... 每种各一个。问用这些砝码能不能表示一个重量为m的东西。
样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中。
第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9)。
3 7
YES
分析:
根据题意,不妨我们假设w=10,那么砝码有:
1;10;100;1000;10000;...........
有这样的规律:
上面那些砝码,只能组成 10010这样只有1和0的数字。
如:10010=10000+10;
不妨假设天平左边放砝码,所以左边只能是 只含0和1的数字
所以需要把右边也凑出这种形式
那么m在什么情况下可以称出来呢?
如果m也是只含有1和0的数字,那不用判断了,肯定能称出来;
否则,可以利用砝码增加m的重量。使得m加上一些砝码==另一些砝码
比如m=9,可以加一个1的砝码,m=m+1=10, 10就可以称出来了。
如果m=8,只有一个1的砝码,凑不到10,所以m=8凑不出来。
同理m=7,6,5,....3,2,都凑不出来。
也就是说,m能成功的情况只有两种
1、m只含有0和1
2、m加上某些砝码后,变成情况1。
对于情况2,我们应该从m的最低位开始考虑,不妨设m=889,
最低位是9,加上1,就可以使最低位变成0。这步之后m = 889+1 =890
然后第二位是9,同上一步,加上1, 这步之后m = 890+10 = 900
然后第三位是9,同上一步,加上1, m = 900+100 = 1000
ok,这个m在加上1,10,100三个砝码之后,重量是1000,是可以称出来的
举个反例,如m=79
最低位是9,加上1,可以使这一位变成0,。这步之后 m = 79+1 = 80
第二位是8,没有砝码能把8凑到1或0。
所以m=79是称不出来的。
综上,我们就按w=10来考虑这个问题,完全可以。
把w推广到任意数,其实就可以看做把10进制数 转化 成其他进制
计算方式与w=10十进制时相同
#include<stdio.h>
#include<math.h>
int main()
{
int w,m;
scanf("%d%d",&w,&m);
while(m)
{
int t=m%w;
if(t==1||t==0); //砝码边可以放一个砝码,无需操作
else if(w%(t+1)==0) //t加上1就可以进位了
m++; //物边可以加一个w的r次方平衡一下 ,但低位都没了,m加1即可
else //失败
{
puts("NO");
return 0;
}
m=m/w;
}
puts("YES");
return 0;
}