自己在存的时候用的结构体不好。。。结果还要看别人的代码。。
收货;
①:大数取模。。(用数组存数字
②;这个地方的边界 vis 和str.len<=500;
③:因为这个地方是如果有多种结果取最小的,所以用for从0到15循环,,我原本不是这样的。。
④;用一个什么样的结构存数组,而且要有len,是因为要方便地判断数组的长度
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 1000000000
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
int c,m,n;
int num[20];
int vis[5010];
struct Node{
int a[510];
int len;
Node(){
len=0;
}
};
int mod(Node t){
int ret=0;
for(int i=0;i<t.len;++i){
ret=(ret*c+t.a[i])%n;
}
return ret;
}
void print_ans(Node ans) {
for (int i = 0; i < ans.len; i++) {
if (ans.a[i] <= 9)
printf("%d", ans.a[i]);
else
printf("%c", ans.a[i] - 10 + 'A');
}
printf("\n");
}
bool bfs(){
queue<Node>que;
while(!que.empty())que.pop();
Node s;
for (int i = 1; i < 16; i++) { //z //第一位数不能为0,所以这里从1开始
if (num[i]) {
s.a[0] = i; //入队
s.len = 1;
int r = mod(s);
if (!r) { //如果余数为0,那么就符合了题目的意思,为n的整数倍,输出
print_ans(s);
return 1;
} else {
if (!vis[r]) { //如果余数不为0,且之前没出现过,那么就入队并记录
vis[r] = 1;
que.push(s);
}
}
}
}
while(!que.empty()){
Node nxt=que.front();que.pop();
for(int i=0;i<16;++i){
if(!num[i])continue;
nxt.a[nxt.len]=i;
nxt.len++;
int ret=mod(nxt);
if(!ret){
print_ans(nxt);return 1;
}
if(!vis[ret]&&nxt.len<=500){
vis[ret]=1;
que.push(nxt);
}
nxt.len--;
}
}
return false;
}
void init(){
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
}
int main(){
int t;
scanf("%d",&t);
while(t--){
init();
scanf("%d%d",&n,&c);
scanf("%d",&m);
for(int i=0;i<m;++i){
char tmp[3];
scanf("%s",tmp);
if(tmp[0]<='9'&&tmp[0]>='0')
num[tmp[0]-'0']=1;
else
num[tmp[0]-'A'+10]=1;//这里我一开始没有写好,,查了好久
}
if (n == 0) { //如果n为0,那么还要特判一下,看组成密码的元素中是否含有0。
if (num[0])
printf("0\n");
else
printf("give me the bomb please\n");
continue;
}
if(!bfs())printf("give me the bomb please\n");
}
}