C. C. Blog

Security Research, Algorithm and Data Structure

51Nod 1109 01组成的N的倍数

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;
/*for(int i=nex.v.size()-1;i>=0;i--){
printf("%d",nex.v[i]);
}
printf("\n");*/
}
else{
ans=minn(ans,nex.v);
/*for(int i=nex.v.size()-1;i>=0;i--){
printf("%d",nex.v[i]);
}
printf("\n");*/
}
}
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;
}
  • 本文作者: CCWUCMCTS
  • 本文链接: https://ccwucmcts.github.io/posts/56907/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!