Problem
给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只包含0或1。求最小的M。 例如:N = 4,M = 100。
Solution
bfs,有点难写。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include<stdio.h> #include<bits/stdc++.h> #define ll long long using namespace std; int n; struct E{ int cur,cnt; vector<int>v; E(int cu,int cn):cur(cu),cnt(cn){} }; bool check(int x){ while(x){ if(x%10!=0&&x%10!=1){ return false; } x/=10; } return true; } int sum=10000; vector<int>ans; queue<E>q; vector<int>minn(vector<int> &x,vector<int> &y){ if(x.size()>y.size()) return y; if(x.size()<y.size()) return x; for(int i=x.size()-1;i>=0;i--){ if(x[i]>y[i]){ return y; } else if(x[i]<y[i]){ return x; } } return y; } void bfs(){ if(check(n)){ sum=1; while(n){ ans.push_back(n%10); n/=10; } return; } q.push(E(0,0)); while(!q.empty()){ E cur=q.front();q.pop(); if(cur.cnt+1>sum) return; for(int i=0;i<=9;i++){ E nex=cur; nex.cur=cur.cur+i*n; nex.cnt++; if(nex.cur%10==0||nex.cur%10==1){ nex.v.push_back(nex.cur%10); nex.cur/=10; if(check(nex.cur)&&i!=0){ while(nex.cur){ nex.v.push_back(nex.cur%10); nex.cur/=10; } if(sum==10000){ ans=nex.v; sum=nex.cnt;
} else{ ans=minn(ans,nex.v);
} } else{ q.push(nex); } } } } } int main(){ scanf("%d",&n); bfs(); for(int i=ans.size()-1;i>=0;i--){ printf("%d",ans[i]); } return 0; }
|