poj 1426
阿新 • • 發佈:2018-04-21
acm參考文章:
http://user.qzone.qq.com/289065406/blog/1303946967
http://www.cnblogs.com/ACShiryu/archive/2011/07/24/2115356.html
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