第一版:dfs。看了mars167的BLOG,原来题面是吓唬人的,用 unsigned long long 可以过。
第二版:居然还有用循环代替搜索的手段: 注意,用 long long 就可以过,因为是从小到大解题。
mod[i]= mod[i/2]*10+ i%2;
第三版:bfs。因为不用结构体,广搜比深搜好写(long long WA;unsigned long long AC。为什么呢?广搜一定是从小到大啊)。
代码:
dfs:125ms 660kB
//125ms 660kB#include<iostream>
using namespace std;typedefunsignedlonglong LL ;
LL ans ;
bool ok;int N;voiddfs(LL n ,int zeros){if(ok || zeros >20)return;if(n % N ==0){
ans = n;
ok = true;return;}dfs(n*10, zeros+1);dfs(n*10+1, zeros+1);}intmain(){while(true){
cin>>N;if(!N)break;
ans =0;
ok = false;dfs(1,0);
cout<<ans<<endl;}return0;}
公式,循环:125ms 4776kB
//125ms 4776kB//输出的是满足题意的最小解 #include<iostream>
using namespace std;constint maxn =1048576+5;//2**20int N;longlong mod[maxn];longlong ans;intmain(){while(cin>>N && N){
mod[0]=0;for(int i=1;;i++){
mod[i]= mod[i/2]*10+ i%2;if(mod[i]% N ==0){
ans = mod[i];break;}}
cout<<ans<<endl;}return0;}
bfs:969ms 4824kB
//969ms 4824kB#include<iostream>#include<queue>
using namespace std;typedefunsignedlonglong LL;int N ;
LL ans;
priority_queue<LL , vector<LL>, greater<LL>> Q;voidbfs(){
Q.push(1);while(!Q.empty()){
ans = Q.top(); Q.pop();if(ans % N ==0)return;
Q.push(ans *10);
Q.push(ans *10+1);}return;}intmain(){while(cin>>N && N){while(!Q.empty())
Q.pop();bfs();
cout<<ans<<endl;}return0;}