1449 砝码称重
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
现在有好多种砝码,他们的重量是 w0,w1,w2,... 每种各一个。问用这些砝码能不能表示一个重量为m的东西。
样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中。
Input
单组测试数据。
第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9)。
Output
如果能,输出YES,否则输出NO。
Input示例
3 7
Output示例
YES
问题其实就等价于 求m能否被2个只由0和1组成的w进制数a,b相减得到 且这a,b在第k位不全为1
例如7 转化为3进制的21
21=101-10
//法1:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<time.h>
#include<math.h>
#include<list>
#include<cstring>
#include<fstream>
#include<bitset>
//#include<memory.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define INF 1000000007
bool change(int w,int m,deque<int>&de){//能否转换成w进制数
ll n=1;
while(n<=m)
n*=w;
while(m){
n/=w;
de.push_back(m/n);
if(de.back()>=w)
return false;
m%=n;
}
return true;
}
bool f(int w,int m){
deque<int>de;
if(!change(w,m,de))
return false;
for(int i=de.size()-1;i>0;--i){
if(de[i]==w-1)
de[i-1]+=1;
else
if(de[i]>1)
return false;
}
return de.front()==1||de.front()==w-1||de.front()==w;
}
int main()
{
//freopen("/home/lu/文档/r.txt","r",stdin);
//freopen("/home/lu/文档/w.txt","w",stdout);
int w,m;
cin>>w>>m;
cout<<(w==2||f(w,m)?"YES":"NO")<<endl;
return 0;
}
//大神调教后的代码
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<time.h>
#include<math.h>
#include<list>
#include<cstring>
#include<fstream>
#include<bitset>
//#include<memory.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define INF 1000000007
int main()
{
//freopen("/home/lu/文档/r.txt","r",stdin);
//freopen("/home/lu/文档/w.txt","w",stdout);
int w,m;
cin>>w>>m;
if(w<4){
cout<<"YES"<<endl;
return 0;
}
while(m){
if(0==(m-1)%w)
m--;
else
if(0==(m+1)%w)
++m;
else
if(m%w){
cout<<"NO"<<endl;
return 0;
}
m/=w;
}
cout<<"YES"<<endl;
return 0;
}