求出n的倍数m,要求m使用的不同数字最少,且最小。
一开始不知道怎么搜,因为不知道m由多少个不同的数字组成。
然后百度了一下,看到和数论有关。
m可能使用的数字的个数可能为一个或者两个
a,aa,aaa....n+1个a, 将这些数%n,那么肯定有两个余数相等,抽屉原理。那么这两个数相减,得到的数肯定是n的倍数,且这两个数由a和0组成。
所以就知道怎么搜了,先搜m由一个数组成的情况,如果不存在,那么就搜两个数组成的情况,要注意全部搜完,因为题目要求m最小。
1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #include <iostream> 5 #include <string> 6 using namespace std; 7 struct node 8 { 9 int res; 10 string str; 11 }; 12 bool vis[66666];; 13 int digit; 14 int cnt; 15 string ans; 16 bool find_; 17 18 void bfs1(int n) 19 { 20 int res; 21 int k; 22 for(int i=1; i<=9; ++i) 23 { 24 k = 1; 25 res = i % n; 26 memset(vis,0,sizeof(vis)); 27 while(!vis[res] && res!=0) 28 { 29 vis[res] = true; 30 res = (res * 10 + i) % n; 31 k++; 32 } 33 if(res==0) 34 { 35 if(cnt==0) 36 { 37 cnt = k; 38 digit = i; 39 } 40 else if(cnt>k) 41 { 42 cnt = k; 43 digit = i; 44 } 45 } 46 } 47 } 48 void bfs2(int i, int j,int n) 49 { 50 memset(vis,0,sizeof(vis)); 51 queue<node> q; 52 node cur,tmp; 53 if(i!=0) 54 { 55 cur.res = i % n; 56 cur.str = (char)(i+'0'); 57 q.push(cur); 58 } 59 cur.res = j % n; 60 cur.str = (char)(j+'0'); 61 q.push(cur); 62 while(!q.empty()) 63 { 64 cur = q.front(); q.pop(); 65 if(cur.res ==0) 66 { 67 if(!find_) 68 { 69 ans = cur.str; 70 find_ = true; 71 } 72 else if(cur.str.size() < ans.size()) 73 ans = cur.str; 74 else if(cur.str.size()==ans.size() && cur.str < ans) 75 ans = cur.str; 76 return; 77 78 } 79 if(find_ && cur.str.size() >= ans.size()) 80 continue; 81 tmp.res = (cur.res * 10 + i) % n; 82 if(!vis[tmp.res]) 83 { 84 vis[tmp.res] = true; 85 tmp.str = cur.str + (char)(i+'0'); 86 87 q.push(tmp); 88 } 89 tmp.res = (cur.res * 10 + j) % n; 90 if(!vis[tmp.res]) 91 { 92 vis[tmp.res] = true; 93 tmp.str = cur.str + (char)(j+'0'); 94 q.push(tmp); 95 } 96 } 97 } 98 99 int main() 100 { 101 int n,i,j; 102 while(scanf("%d",&n),n) 103 { 104 find_ = false; 105 cnt = 0; 106 bfs1(n); 107 if(cnt!=0) 108 for(i=0; i<cnt; ++i) 109 printf("%d",digit); 110 else 111 { 112 for(i=0; i<=9; ++i) 113 for(j=i+1; j<=9; ++j) 114 { 115 bfs2(i,j,n); 116 } 117 cout<<ans; 118 } 119 puts(""); 120 } 121 }