1. 程式人生 > >51nod 1449 砝碼稱重

51nod 1449 砝碼稱重

給培訓找貪心題的時候看到的,一道和貪心沒任何關係的小水題。

首先如果有解,那麼有:
i w a

i i w b i = m

容易發現若 ( m w x , w ) = 1

,那麼將等式兩邊除以 w x 後,左式必然(因為有解)將剩餘一個 ± 1 ,將其移至右邊將使得 w | m + 1 w | m 1 (當 w > 2 時顯然只會有一個滿足,而 w 2 時必然有解)。我們繼續如法炮製最終便會將等式兩邊都變成 1 。容易通過將這個過程反向得出 m 的解(當然題目沒有要求)。

故我們直接按上述過程計算,若某時 x | m ± 1 ,則無解。總時間複雜度 O ( l o g m )

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
typedef unsigned long long ull;
typedef long long ll;
//--Container--
//

void cl(){
    int w,n;bool fg=1;scanf("%d %d",&w,&n);
    if(w<=2){printf("YES\n");return;};
    for(;;){
        for(;!(n%w);n/=w);
        if(n==1)break;
        if(!((n+1)%w))++n;
        else if(!((n-1)%w))--n;
        else{
            fg=0;break;
        }
    }
    printf("%s\n",fg?"YES":"NO");
};

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif
    cl();
    return 0;
};