51 nod 砝码称重(贪心+进制转换思想)



现在有好多种砝码,他们的重量是  w0,w1,w2,... w0,w1,w2,...  每种各一个。问用这些砝码能不能表示一个重量为m的东西。

样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中。


Input
单组测试数据。 
第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9)。
Output
如果能,输出YES,否则输出NO。
Sample Input
3 7
Sample Output
YES




挺难想的   m能否用天平称出来的关键是如何使天平平衡    

如果物体m可以被称出来   可表示为    m + 一堆砝码(可能为0)=  另一堆砝码      

由于砝码的重量是幂的形式并且个数只有一个      

所以我们取出的一堆砝码的重量就可以表示为w进制下  一个由 0 1 组成的串    

基于此  我们可以将m也转化成w进制   

现在  判断物体m是否可以被称出来   就变成了   m +  一个w进制下由 0 1 组成的串 是否可以组成一个新的由 0 1  组成的串(另一堆砝码)

当由m转化成的w进制的某一位为0或者1时 给他它+0(理解为不作处理)  如果为w-1时  我们就给它+1(相当于加一个砝码) 使其进位  本位变为0   如果是其他情况  就不能转化成 0 1 组成的串   所以就不能称出





AC代码:

#include <stdio.h>
int main (){
    int w,m;
    scanf ("%d%d",&w,&m);
    while (m){
        if (m%w==0||m%w==1){
            m=m/w;
        }
        else if (m%w==w-1){
            m=(m+1)/w;
        }
        else {
            printf ("NO\n");
            return 0;
        }
    }
    printf ("YES\n");
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值