51NOD 1449 砝码称重

来源:互联网 发布:php超时时间设置 编辑:程序博客网 时间:2024/04/19 07:47
1449 砝码称重题目来源: CodeForces基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题收藏关注现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个。问用这些砝码能不能表示一个重量为m的东西。样例解释:可以将重物和3放到一个托盘中,91放到另外一个托盘中。Input单组测试数据。第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9)。Output如果能,输出YES,否则输出NO。Input示例3 7Output示例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 1000000007bool 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 1000000007int 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;}
0 0