题意:
求n的倍数m,要求m中只能有0或者1.即构造一个只有0,1,组成的整数并且可以整除n.
YY:
本题有多种做法,dfs,bfs,dp。bfs里有数论做法和zoj 1889 1136 类似。但我还是喜欢用bfs做,直观又简单。…………
我是因为要做广搜才去碰这题目的。一开始真的是没有想法,怎么搜?搜什么?
后来在纸上画了个类似二叉树的01序列,貌似有点明白怎么个bfs法。
但是一开始写出的bfs太挫了。MLE,还漏掉了很多情况。
如下(吸取教训)
#include <string.h> #include <iostream> #include <queue> #include <cstdio> using namespace std; queue<long long>Q; void bfs(long long n) { long long i; long long s=0; Q.push(1); while(!Q.empty ()) { i=Q.front (); Q.pop (); s=s*10+i; if(s%n==0) break; Q.push (1); Q.push (0); } printf("%lld\n",s); } int main() { long long n; while(scanf("%lld",&n)!=EOF) { if(n==0) break; bfs(n); } return 0; }
#include <string.h> #include <iostream> #include <queue> #include <cstdio> using namespace std; queue<long long>Q; void bfs(long long n) { long long i; long long s=0; Q.push(1); while(!Q.empty ()) { s=Q.front (); if(s%n==0) break; Q.pop (); Q.push (s*10); Q.push (s*10+1); } printf("%lld\n",s); } int main() { long long n; while(scanf("%lld",&n)!=EOF) { if(n==0) break; while(!Q.empty ()) Q.pop (); bfs(n); } return 0; }
dfs 做法:http://hi.baidu.com/vivyli/blog/item/21b549dc3c22cba5cd1166d4.html
数论做法:http://hi.baidu.com/ly01kongjian/blog/item/d21e666f4734f5f1421694a8.html