hdu 4474
2012 ICPC/ACM 成都现场赛K题
题意:输入n,m,m个数字
n的最小倍数:要求不存在题中给的m个数字0~9;即x%n==0;不存在输出-1;
结果会爆64位,所以用符合条件的数字进行bfs,最早找到的就是答案;
记录:pre[t]记录到达t的前一节点u,num[t]记录形成t的最后一位数字。
具体看代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 #define N 10100 5 using namespace std; 6 int pre[N],num[N],a[10]; 7 int n,m,x; 8 void init() 9 { 10 memset(pre,-1,sizeof(pre)); 11 memset(num,-1,sizeof(num)); 12 memset(a,0,sizeof(a)); 13 } 14 void print(int u) 15 { 16 if (pre[u]!=-1) print(pre[u]); 17 printf("%d",num[u]); 18 } 19 int bfs() 20 { 21 int i,j,t; 22 queue<int>q; 23 for (i=1;i<10;++i) 24 { 25 if (!a[i]) 26 { 27 t=i%n; 28 if (t==0) { printf("%d",i);return 0;} 29 q.push(t);num[t]=i; 30 } 31 } 32 while (!q.empty()) 33 { 34 int u=q.front(); 35 q.pop(); 36 for (i=0;i<10;++i) 37 { 38 if (!a[i]) 39 { 40 t=(10*u+i)%n; 41 if (num[t]==-1) {q.push(t);pre[t]=u;num[t]=i;} 42 if (t==0) 43 { 44 print(t); 45 return 0; 46 } 47 } 48 } 49 } 50 printf("-1"); 51 return 0; 52 } 53 int main () 54 { 55 int i,j,k=0; 56 while (scanf("%d%d",&n,&m)!=EOF) 57 { 58 init(); 59 while (--m>=0) 60 { 61 scanf("%d",&x); 62 a[x]=1; 63 } 64 printf("Case %d: ",++k); 65 bfs(); 66 printf("\n"); 67 } 68 return 0; 69 }