51nod 1449 砝码称重

好题。

如果答案为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");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值