题意:
思路:跟网络赛的一样,少了一个= ,昨晚纠结了一个晚上。。。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int n,m,k;
int re[29];
void init()
{
scanf("%d%d%d",&n,&m,&k);
char ch[3];
for(int i=0;i<k;i++)
{
scanf("%s",ch);
if(ch[0]<='9'&&ch[0]>='0') re[i]=ch[0]-'0';
else re[i]=ch[0]-'A'+10;
}
sort(re,re+k);
}
int pre[5009];
int v[5009];
int ans[5009],cnt;
queue<int> que;
void find(int k)
{
if(pre[k]!=-1) find(pre[k]);
ans[cnt++] = v[k];
}
void solve()
{
if(n==0){
if(re[0]!=0)
printf("give me the bomb please\n");
else
printf("0\n");
return ;
}
memset(v,-1,sizeof(v));
while(!que.empty()) que.pop();
for(int i=0;i<k;i++)
{
if(re[i]){
que.push(re[i]%n);
if(v[re[i]%n]==-1)
pre[re[i]%n]=-1,v[re[i]%n] = re[i];
}
}
while(!que.empty())
{
int e = que.front(); que.pop();
if(e==0) break ;
for(int i=0;i<k;i++)
{
int t = (e*m+re[i])%n;
if(v[t]!=-1) continue;
pre[t] = e;
v[t] = re[i];
que.push(t);
}
}
if(v[0]==-1){
printf("give me the bomb please\n");
return ;
}
cnt = 0;
find(0);
if(cnt>500){
printf("give me the bomb please\n");
return ;
}
for(int i=0;i<cnt;i++){
if(ans[i]<=9) printf("%d",ans[i]);
else printf("%c",ans[i]-10+'A');
}printf("\n");
}
int main()
{
freopen("in.txt","r",stdin);
int cas;
scanf("%d",&cas);
while(cas--)
{
init();
solve();
}
return 0;
}