超级密码
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Problem Description
Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:
密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.
注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.
注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
Input
输入数据的第一行是一个整数T(1<=T<=300),表示测试数据的数量.每组测试数据的第一行是两个整数N(0<=N<=5000)和C(2<=C<=16),其中N表示的是题目描述中的给定十进制整数,C是密码的进制数.测试数据的第二行是一个整数M(1<=M<=16),它表示构成密码的数字的数量,然后是M个数字用来表示构成密码的数字.两个测试数据之间会有一个空行隔开.
注意:在给出的M个数字中,如果存在超过10的数,我们约定用A来表示10,B来表示11,C来表示12,D来表示13,E来表示14,F来表示15.我保证输入数据都是合法的.
注意:在给出的M个数字中,如果存在超过10的数,我们约定用A来表示10,B来表示11,C来表示12,D来表示13,E来表示14,F来表示15.我保证输入数据都是合法的.
Output
对于每组测试数据,如果存在要求的密码,则输出该密码,如果密码不存在,则输出"give me the bomb
please".
注意:构成密码的数字不一定全部都要用上;密码有可能非常长,不要试图用一个整型变量来保存密码;我保证密码最高位不为0(除非密码本身就是0).
注意:构成密码的数字不一定全部都要用上;密码有可能非常长,不要试图用一个整型变量来保存密码;我保证密码最高位不为0(除非密码本身就是0).
Sample Input
3
22 10
3
7 0 1
2 10
1
1
25 16
3
A B C
Sample Output
110
give me the bomb please
CCB
Hint
HintHuge input, scanf is recommended.
Source
----------------------
暴力搜索 用字符匹配,直至符合或者超出范围
1 #include<cstdio> 2 #include<memory.h> 3 #include<queue> 4 #include<string> 5 using namespace std; //不加的话queue的声明无法通过 6 int n,c; 7 int visit[5001];//标记余数 n:0-5000 8 int num[16]; 9 struct ss 10 { 11 int a[502]; 12 int len; 13 }; 14 15 int mod(ss t) 16 { 17 int tt = 0; 18 for(int i = 0; i < t.len; i++) 19 tt = (tt * c + t.a[i]) % n; 20 return tt; 21 } 22 23 void print(ss t) 24 { 25 for(int i = 0; i < t.len; i++) 26 { 27 if(t.a[i] <= 9) 28 printf("%d",t.a[i]); 29 else 30 printf("%c",t.a[i] - 10 + 'A'); 31 } 32 printf(" "); 33 } 34 int bfs() 35 { 36 memset(visit,0,sizeof(visit)); 37 ss s; 38 int modd; 39 queue<ss> q; 40 for(int i = 1; i < 16; i++) 41 { 42 if(num[i]) 43 { 44 s.a[0] = i; 45 s.len = 1; 46 modd = mod(s); 47 if(!modd) //模为0 48 { 49 print(s); 50 return 1; 51 } 52 else 53 { 54 //q.push(s); 55 if(!visit[modd]) 56 { 57 visit[modd] = 1; 58 q.push(s); 59 } 60 } 61 } 62 } 63 while(!q.empty()) 64 { 65 s = q.front(); 66 q.pop(); 67 for(int i = 0; i < 16; i++) 68 { 69 if(num[i]) 70 { 71 s.a[s.len] = i; 72 s.len++; 73 modd = mod(s); 74 if(!modd) 75 { 76 print(s); 77 return 1; 78 } 79 else 80 { 81 if(!visit[modd] && s.len < 499) 82 { 83 visit[modd] = 1; 84 q.push(s); 85 } 86 } 87 88 s.len--; //恢复 89 } 90 } 91 92 } 93 return 0; 94 } 95 96 int main() 97 { 98 freopen("input.txt","r",stdin); 99 int T,m; 100 char ch[2]; //注意字符存取 后面要有一个空间存取' ' 101 scanf("%d",&T); 102 while(T--) 103 { 104 scanf("%d%d",&n,&c); 105 scanf("%d",&m); 106 memset(num,0,sizeof(num)); 107 for(int i = 0; i < m; i++) 108 { 109 scanf("%s",&ch); 110 if(ch[0] >= '0' && ch[0] <='9') 111 num[ch[0]-'0'] = 1; 112 else 113 num[ch[0]-'A'+10] = 1; 114 } 115 116 if(n == 0) 117 { 118 if(num[0]) 119 printf("%d ",0); 120 else 121 printf("give me the bomb please "); 122 } 123 else 124 { 125 bool b = bfs(); 126 if(!b) 127 printf("give me the bomb please "); 128 } 129 130 } 131 return 0; 132 }