超级密码

Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 4   Accepted Submission(s) : 0


Problem Description


Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:
密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.

注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.


Input



输入数据的第一行是一个整数T(1<=T<=300),表示测试数据的数量.每组测试数据的第一行是两个整数N(0<=N& lt;=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.我保证输入数据都是合法的.



Output



对于每组测试数据,如果存在要求的密码,则输出该密码,如果密码不存在,则输出"give me the bomb please". 注意:构成密码的数字不一定全部都要用上;密码有可能非常长,不要试图用一个整型变量来保存密码;我保证密码最高位不为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]Hint[/hint] Huge input, scanf is recommended.

ac代码:

1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 const int MAXN=550;
 7 int num[20];
 8 struct Node{
 9     int s[MAXN];
10     int len;
11 };
12 int M,C,N;
13 int vis[5050];
14 int mod(Node a){
15     int x=0;
16     for(int i=0;i<a.len;i++){
17         x=(x*C+a.s[i])%N;
18     }
19     return x;
20 }
21 void print_ans(Node a){
22     for(int i=0;i<a.len;i++){
23         if(a.s[i]>=0&&a.s[i]<=9)printf("%c",a.s[i]+'0');
24         else printf("%c",a.s[i]-10+'A');
25     }
26     puts("");
27 }
28 void bfs(){
29     memset(vis,0,sizeof(vis));
30     queue<Node>dl;
31     Node a;
32     a.len=1;
33     int md;
34     for(int i=0;i<M;i++){
35         a.s[0]=num[i];
36         md=mod(a);
37         //printf("%d ",md);
38         if(vis[md]||num[i]==0)continue;
39         if(md==0&&num[i]){
40             printf("%d\n",num[i]);
41             return;
42         }
43     //    printf("%d ",md);
44         vis[md]=1;
45         dl.push(a);
46     }
47     while(!dl.empty()){
48         a=dl.front();
49         dl.pop();
50     for(int i=0;i<M;i++){
51         if(a.len==1&&a.s[0]==0)continue;
52         a.s[a.len]=num[i];
53         a.len++;
54         //puts("**");
55         md=mod(a);
56     //    printf("%d ",md);
57     if(vis[md]||a.len>500){
58         a.len--;//这里少了这个错的啊。。。。。无奈。。。。。 
59         continue;
60     }
61     //    print_ans(a);
62         if(md==0){
63             
64             print_ans(a);
65             return;
66         }
67         vis[md]=1;
68         dl.push(a);
69         a.len--;
70         }
71     }
72     puts("give me the bomb please");
73 }
74 int main(){
75     int T;
76     scanf("%d",&T);
77     char s[5];
78     while(T--){
79     scanf("%d%d%d",&N,&C,&M);
80         for(int i=0;i<M;i++){
81             scanf("%s",s);
82             if(s[0]>='0'&&s[0]<='9')num[i]=s[0]-'0';
83             else num[i]=s[0]-'A'+10;
84         //    printf("%d ",num[i]);
85         }
86         sort(num,num+M);
87         if(N)bfs();
88         else if(!num[0])puts("0");
89         else puts("give me the bomb please");
90     }
91     return 0;
92 }


 wa代码,求改正。。。。

感觉没错啊;

代码:


1 #include<stdio.h>
 2 #include<string>
 3 #include<queue>
 4 #include<string.h>
 5 #include<algorithm>
 6 #define mem(a) memset(a,0,sizeof(a))
 7 using namespace std;
 8 const int MAXN=1e4+10;
 9 int cmp(char a,char b){
10     /*if(a<b)return 1;
11     else return 0;*/
12     return a<b;
13 }
14 int vis[MAXN],pre[MAXN];
15 char num[20];
16 int nu[20];
17 char al[MAXN];
18 int n,m,C;
19 void print_ans(){
20     int r=0;
21     string ans;
22     while(ans.empty()||r!=0){
23         ans+=al[r];
24         r=pre[r];
25     }
26     reverse(ans.begin(),ans.end());
27     puts(ans.c_str()); 
28 }
29 void bfs(){
30     queue<int>dl;
31     dl.push(0);
32     while(!dl.empty()){
33         int f1,f2;
34         f1=dl.front();//**
35         dl.pop();
36         for(int i=0;i<m;i++){
37             if(nu[i]==0&&f1==0)continue;
38         f2=(f1*C+nu[i])%n;
39         if(vis[f2])continue;
40         pre[f2]=f1;
41         al[f2]=num[i];
42         if(f2==0){
43             //printf("%d %d\n",f1,f1*C+nu[i]);
44             print_ans();
45             return;
46             }
47             vis[f2]=1;
48         dl.push(f2);
49         }
50     }
51     puts("give me the bomb please");
52 }
53 int main(){
54     int T;
55     scanf("%d",&T);
56     while(T--){
57         mem(vis);mem(pre);mem(al);
58         char x[5]; 
59         scanf("%d%d%d",&n,&C,&m);
60         for(int i=0;i<m;i++){
61             scanf("%s",x);
62             num[i]=x[0];
63             //printf("%c ",num[i]);
64         }
65         sort(num,num+m);
66         int o=0;
67         for(int i=0;i<m;i++){
68             if(num[i]>='A'&&num[i]<='Z')nu[i]=10+num[i]-'A';
69             else nu[i]=num[i]-'0';
70             if(num[i]=='0')o=1;
71             //printf("%c %d ",num[i],nu[i]);
72         }
73         if(n!=0)bfs();
74         else if(o)puts("0");
75         else puts("give me the bomb please");
76     }
77     return 0;
78 }