Poj 1426
找出一个由1和0组成的十进制数m满足m为n的倍数。
有两种做法,一种是bfs从低位数往高位数搜,另一种是用二叉树数组的结构存每次的求出来的余数,当余数为0时返回下标,然后根据下标求出其对应的数。
1.bfs
#include<cstdio>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f,MAXN=1000000000+7;
int cnt,row[15],m,n,ans=INF;
typedef long long LL;
queue<LL> que;
int main(){
while (scanf("%d",&n)==1&&n){
while (!que.empty()) que.pop();
if (n==1) { printf("1\n"); continue; }
que.push(1);
LL x;
while (!que.empty()){
x=que.front(); que.pop();
if ((x*10)%n==0){
x=x*10;
break;
}
else que.push(x*10);
if ((x*10+1)%n==0){
x=x*10+1;
break;
}
else que.push(x*10+1);
}
printf("%lld\n",x);
}
}
2.二叉树数组
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f,MAXN=1000000000+7;
int mod[1000000],cnt,row[15],m,n,ans=INF;
typedef long long LL;
int main(){
while (scanf("%d",&n)==1&&n){
memset(mod,0,sizeof(mod));
mod[1]=1;
int i;
for (i=2;mod[i-1]!=0;i++){
mod[i]=(mod[i/2]*10%n+i%2)%n;
}
i--;
vector<int> ans;
while (i){
ans.push_back(i%2);
i/=2;
}
for (int u=ans.size()-1;u>=0;u--) printf("%d",ans[u]);
putchar('\n');
}
}