1. 程式人生 > >poj 1426

poj 1426

acm

參考文章:
http://user.qzone.qq.com/289065406/blog/1303946967    
http://www.cnblogs.com/ACShiryu/archive/2011/07/24/2115356.html


題意是給出一個數,求出這個數的任意一個倍數,這個倍數必須由0或1組成。
思路是反向從結果驗證,即數字只由0或1組成,那麽第一位必定是1,之後的幾位不是1就是0。如果組成的數字可以整除給出的數字,那麽就是答案。否則就加位驗證。


#include<cstdio>
#include<iostream>

using namespace std;

bool result;

void dfs(unsigned long long t,int n,int k){
    if(result){
        return;
    }
    if(t%n==0){
        cout<<t<<endl;
        result=true;
        return;
    }
    if(k==19){
        return;
    }
    dfs(t*10,n,k+1);
    dfs(t*10+1,n,k+1);
}

int main(){
    int n;
    while(~scanf("%d",&n)){
        result = false;
        if(n==0)
            break;
        dfs(1,n,0);
    }
    return 0;
}

這裏的k設定為19是數據限制,來自參考文章。
然後由於數據很大,所以必須用無符號的長×××儲存。

poj 1426