hdu1226

来源:互联网 发布:打卡网络用语 编辑:程序博客网 时间:2024/06/06 23:53

 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;}


0 0
原创粉丝点击