思路:标记出现过的数字并依次进入队列进行bfs,注意标记已经出现过的余数,防止重复计算。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
int N, C;
int vis[20];
typedef struct {
int s[510];
int len;
}PP;
int Mod(PP p)
{
int len = p.len;
int s = 0;
for (int i = 0; i < len; i++)
{
s = (s*C + p.s[i])%N;
}
return s;
}
void Print(PP p)
{
int len = p.len;
for (int i = 0; i < len; i++)
{
if (p.s[i]>=10)
printf("%X",p.s[i]);
else
printf("%d",p.s[i]);
}
printf("\n");
}
void bfs()
{
int book[6000], mod;
queue<PP>q;
memset(book,0,sizeof(book));
for (int i = 1; i < C; i++)
{
if (!vis[i])
continue;
PP a;
a.s[0]=i;
a.len=1;
mod = Mod(a);
if (!book[mod])
book[mod]=1;
else
continue;
q.push(a);
}
while (!q.empty())
{
PP a,b;
a = q.front();
q.pop();
mod = Mod(a);
if (mod==0)
{
Print(a);
return ;
}
for (int i = 0; i < C; i++)
{
if (!vis[i])
continue;
b = a;
b.s[b.len]=i;
b.len++;
mod = Mod(b);
if (!book[mod])
book[mod]=1;
else
continue;
q.push(b);
}
}
printf("give me the bomb please\n");
}
int main(void)
{
int T;
scanf("%d", &T);
while (T--)
{
memset(vis,0,sizeof(vis));
scanf("%d %d", &N, &C);
int n;
scanf("%d", &n);
while (n--)
{
int x;
scanf("%x", &x);
vis[x]=1;
}
if (N)
bfs();
else
{
if (vis[0])
printf("0\n");
else
printf("give me the bomb please\n");
}
}
return 0;
}