hdu1226 :点击打开题目链接
本题目由于题目意思,容易得知是一道广搜的题目。
首先。 我们需要知道 ,大数取模,比如 如何判断1234567 对15 取模的数为多少?答案是7,但是如果他是大数怎么办,
假设num数组存一个大数;左边为高位,右边为低位
int temp=0;
for(int i=最高位;i<=个位;i++)
temp=(temp * 某进制+num[i])%N;
return temp; // 最终的temp就是bignumber mod N 的值。
如果该余数出现过就没必要再次进队列了,因为此次模一样代表着下次的模也一样当这个数的模为0,那么前面的数模早已经为0,所以,后者没必要进队列。
.12
#include<iostream> #include<stdio.h> #include<algorithm> #include<vector> #include<string> #include<string.h> #include<queue> using namespace std; const int INF=~(1<<31); const int MM=1005; int N,C,M; bool digit[18],vis[5005]; int mod(string& a) { int temp=0; for(int i=0; i<a.size(); i++) { temp=(temp*C+(int)a[i])%N; } return temp; } void print(string& a) { for(int i=0; i<a.size(); i++) { printf("%X",(int)a[i]); } cout<<endl; } bool bfs() { queue<string>q; string a,b; for(int i=1; i<=15; i++) { if(digit[i]) { a=(char)i; if(mod(a)==0) { print(a); return false; } q.push(a); } } while(!q.empty()) { a=q.front(); q.pop(); for(int i=0; i<=15; i++) { if(digit[i]&&a.size()+1<=500) { b=a+(char)i; int mood=mod(b); if(mood==0) { print(b); return false; } else { if(vis[mood]==0) { vis[mood]=1; q.push(b); } } } } } return true; } int main(void) { int ncase; scanf("%d",&ncase); while(ncase--) { memset(digit,0,sizeof(digit)); memset(vis,0,sizeof(vis)); scanf("%d%d%d",&N,&C,&M); for(int i=0; i<M; i++) { int val; scanf("%x",&val); digit[val]=true; } if(N==0) { if(digit[0]) cout<<"0"<<endl; else cout<<"give me the bomb please"<<endl; continue; } if(bfs()) cout<<"give me the bomb please"<<endl; } return 0; }