注意密码位数<=500 输出注意十六进制改成字母
要点题目都已说明 ac就好
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> #define N 5100 #define L(x) (x<<1) #define R(x) (x<<1|1) using namespace std; inline int Max(int a,int b){return a>b?a:b;} inline int Min(int a,int b){return a<b?a:b;} int a[20],k,n,c; int vis[N]; //取模后出现的可能只会是 [0, n-1] int pre[N]; int num[N]; void BFS(){ memset(vis, 0, sizeof(vis)); memset(pre, -1, sizeof(pre)); queue<int>q; int mod; for(int i=0;i<k;i++) { if(!a[i])continue; mod = a[i]%n; if(!vis[mod]) { vis[mod] = 1; num[mod] = a[i]; q.push(mod); } if(a[i]%n == 0) {if(a[i]<=10)printf("%d\n",a[i]); else printf("%c\n",a[i]-10+'A');return ;} } bool su =false; while(!q.empty() && su == false){ mod = q.front(); q.pop(); for(int i=0;i<k;i++) { int now = (mod*c + a[i])%n; if(now == 0){ pre[now] = mod;num[now]=a[i]; su = true; break; } if(!vis[now]) { q.push(now); vis[now]=1; pre[now] = mod; num[now] = a[i]; } } } if(su == false){printf("give me the bomb please\n");return ;} int top=0,ans[N]; for(int i=0; i!=-1;i=pre[i]) ans[top++]=num[i]; if(top>500){printf("give me the bomb please\n");return ;} for(int i=top-1;i>=0;i--) if(ans[i]>=10) printf("%c",ans[i] - 10 +'A'); else printf("%d",ans[i]); printf("\n"); } int main(){ int T;scanf("%d",&T); while(T--){ scanf("%d %d %d",&n,&c,&k); for(int i=0;i<k;i++){ char c=getchar(); while( !( '0'<=c && c<='9') && !( 'A'<=c && c<='F')) c=getchar(); if( '0'<=c && c<='9' ) a[i] = c - '0'; else a[i] = c - 'A' +10; } sort(a,a+k); if(n == 0){ if(a[0])printf("give me the bomb please\n"); else printf("0\n"); continue; } BFS(); } return 0; } /* 3 22 10 3 7 0 1 2 10 1 1 25 16 3 A B C */