题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1226
题意:
给出n,c,m,密码必须是n这个十进制数的整数倍,c代表这个密码是C进制数,m代表这个密码只有m种字符构成,而且密码不能长于500
(做了半天没做出来!最后看题解A掉http://blog.csdn.net/libin56842/article/details/9750901。。。好惨)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int num[20],vis[5005];
int n,c,m;
struct node
{
int s[505];
int len;
};
int print(node a)
{
int i;
for(i = 0; i<a.len; i++)
{
if(a.s[i]<=9)
printf("%d",a.s[i]);
else
printf("%c",a.s[i]+'A'-10);
}
printf("\n");
}
int mod(node a)
{
int i,tem = 0;
for(i = 0; i<a.len; i++)
{
tem = (tem*c+a.s[i])%n;
}
return tem;
}
int BFS()
{
memset(vis,0,sizeof(vis));
node a;
queue<node> Q;
a.len = 0;
int i,r;
for(i = 1; i<16; i++)
{
if(num[i])
{
a.s[0] = i;
a.len = 1;
r = mod(a);
if(!r)
{
print(a);
return 1;
}
else
{
if(!vis[r])
{
vis[r] = 1;
Q.push(a);
}
}
}
}
while(!Q.empty())
{
a = Q.front();
Q.pop();
for(i = 0; i<16; i++)
{
if(num[i])
{
a.s[a.len] = i;
a.len++;
r = mod(a);
if(!r)
{
print(a);
return 1;
}
else
{
if(!vis[r] && a.len<499)
{
vis[r] = 1;
Q.push(a);
}
}
a.len--;
}
}
}
return 0;
}
int main()
{
int t,i;
char str[2];
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&c,&m);
memset(num,0,sizeof(num));
for(i = 0; i<m; i++)
{
scanf("%s",str);
if(str[0]>='0' && str[0]<='9')
num[str[0]-'0'] = 1;
else
num[str[0]-'A'+10] = 1;
}
if(n)
{
int flag;
flag = BFS();
if(!flag)
printf("give me the bomb please\n");
}
else
{
if(num[0])
printf("0\n");
else
printf("give me the bomb please\n");
}
}
return 0;
}