hdu 1664 Different Digits

来源:互联网 发布:js怎么给隐藏域赋值 编辑:程序博客网 时间:2024/06/04 18:12

参考 http://blog.csdn.net/u010228612/article/details/9715555#comments  ....狂拽酷炫YXJ~~~~

ps:一个数论中的结论:对于任意的整数n,必然存在一个由不多于两个的数来组成的一个倍数。因为a,aa,aaa……取n+1个,则必有两个模n余数相同,相减即得n的倍数m。而m只由a、0组成。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include <string>using namespace std;int n;bool vis[70000];string ans,tans,ttans;struct node{    int dig;    int pa;    int mod;    int deep;}Q[70000];int X[5];int tag;int head,tail;void print(int t){    if(t==-1)    {        return;    }    else    {        print(Q[t].pa);        tans+=Q[t].dig+'0';    }}bool bfs(int lit){    node w,e;    memset(vis,false,sizeof(vis));    head=tail=0;    for(int i=1;i<=lit;i++)    {        if(X[i]==0)continue;        e.dig=X[i];        e.mod=X[i]%n;        e.pa=-1;        vis[e.mod]=true;        e.deep=1;        Q[tail++]=e;    }    while(head<tail)    {        w=Q[head];        if(w.mod==0)        {            print(head);            return true;        }        if(w.deep>ans.length() && ans!="zz")//剪枝啦啦啦        {            return false;        }        for(int i=1;i<=lit;i++)        {            e=w;            e.mod=(e.mod*10+X[i])%n;            if(!vis[e.mod])            {                e.dig=X[i];                e.pa=head;                e.deep++;                vis[e.mod]=true;                ttans+=e.dig+'0';                Q[tail++]=e;            }        }        head++;    }    return false;}int main(){    while(scanf("%d",&n)!=EOF && n)    {        ans="zz";        for(int i=1;i<=9;i++)        {            X[1]=i;            tans="";            if(bfs(1))            {                if(ans=="zz")ans=tans;                if(tans<ans&&tans.length()==ans.length() || tans.length()<ans.length())                ans=tans;            }        }        if(ans!="zz")        {            cout<<ans<<endl;            continue;        }        for(int i=0;i<9;i++)        {            X[1]=i;            for(int j=i+1;j<=9;j++)            {                X[2]=j;                tans="";                if(bfs(2))                {                    if(ans=="zz")ans=tans;                    if(tans<ans&&tans.length()==ans.length() || tans.length()<ans.length())                    ans=tans;                }            }        }        cout<<ans<<endl;    }    return 0;}


原创粉丝点击