hdu 1226

超级密码

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2142    Accepted Submission(s): 675


Problem Description
Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:
密码是一个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.我保证输入数据都是合法的.
 

 

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
Huge input, scanf is recommended.
 

 

Author
Ignatius.L
 

 

Source
 
  1 #include<iostream>

  2 #include<stdio.h>

  3 #include<cstring>

  4 #include<cstdlib>

  5 #include<queue>

  6 #include<algorithm>

  7 using namespace std;

  8 

  9 struct node

 10 {

 11     char num[501];

 12     int len;

 13 };

 14 queue<node>Q;

 15 bool use[17],hash[5002];

 16 int  n,c,m;

 17 

 18 int zc(node n1)

 19 {

 20     int i,mod=0,k;

 21     for(i=1;i<=n1.len;i++)

 22     {

 23         if(n1.num[i]>='0'&&n1.num[i]<='9')

 24             k=n1.num[i]-'0';

 25         else k=n1.num[i]-'A'+10;

 26         mod=(mod*c+k)%n;

 27     }

 28     return mod;

 29 }

 30 void print(node n1)

 31 {

 32     int i;

 33     for(i=1;i<=n1.len;i++)

 34         printf("%c",n1.num[i]);

 35     printf("\n");

 36 }

 37 int bfs()

 38 {

 39     int i,k;

 40     struct node t,cur;

 41 

 42     for(i=0;i<16;i++)

 43     {

 44         if(use[i]==true)

 45         {

 46             t.len=1;

 47             if(i<=9)

 48             t.num[1]=i+'0';

 49             else t.num[1]=i-10+'A';

 50             k=i%n;

 51             if(k==0)

 52             {

 53                 if(i==0)continue;

 54                 if(i>=10)printf("%c\n",i-10+'A');

 55                 else printf("%c\n",i+'0');

 56                 return 1;

 57             }

 58             else if(hash[k]==false)

 59             {

 60                 hash[k]=true;

 61                 Q.push(t);

 62             }

 63         }

 64     }

 65     while(!Q.empty())

 66     {

 67         t=Q.front();

 68         Q.pop();

 69         if(t.len>=500)continue;

 70         for(i=0;i<16;i++)

 71         {

 72             if(use[i]==true)

 73             {

 74                 cur=t;

 75                 cur.len++;

 76                 if(i>=10)

 77                 cur.num[cur.len]=i+'A'-10;

 78                 else cur.num[cur.len]=i+'0';

 79 

 80                 k=zc(cur);

 81                 if(k==0)

 82                 {

 83                     print(cur);

 84                     return 1;

 85                 }

 86                 else if(hash[k]==false)

 87                 {

 88                     Q.push(cur);

 89                     hash[k]=true;

 90                 }

 91             }

 92         }

 93     }

 94     return -1;

 95 }

 96 int main()

 97 {

 98     int T,i,k;

 99     char cur[5];

100     scanf("%d",&T);

101     while(T--)

102     {

103         scanf("%d%d%d",&n,&c,&m);

104         memset(use,false,sizeof(use));

105         memset(hash,false,sizeof(hash));

106         while(!Q.empty())

107         {

108             Q.pop();

109         }

110         for(i=1;i<=m;i++)

111         {

112             scanf("%s",cur);

113             if(cur[0]>='0' && cur[0]<='9')

114                 use[cur[0]-'0']=true;

115             else if(cur[0]>='A')

116                 use[cur[0]-'A'+10]=true;

117         }

118         if(n==0)//!!!(⊙o⊙)…

119         {

120             if(use[0]==true)

121             {

122                 printf("0\n");

123             }

124             else printf("give me the bomb please\n");

125         }

126         else

127         {

128             k=bfs();

129             if(k==-1)printf("give me the bomb please\n");

130         }

131     }

132     return 0;

133 }

 

你可能感兴趣的:(HDU)