hdu1664 Different Digits

来源:互联网 发布:java中断 原理 编辑:程序博客网 时间:2024/06/12 00:12

对于任意n,其倍数中,一定有由两个不同数字组成的数。因为将只由a0<a<10一定会产生一个循环节,而将任意两个模n同余的数相减,就可以得到只由a0组成的n的倍数。
这题让我想起了前几天同学给我看的一道水题(Poj2551),这题提到对于任意奇数n5/|n,其倍数都一定有是由连续的1组成的十进制数,其实,只要满足条件的n,其倍数都一定有是由连续的a0<a<10组成的连续的十进制数升序排序,显然有:

ai=10ai1+a

同样,该序列一定在模n下构成一个循环节,且一定存在i,使
aia(modn)


10ai1+a10ai1ai1ai1a(modn)0(modn)0(modngcd(10,n))0(modn)

当然,在这题中,先检查n是否有只由1个数字组成的倍数,再bfs求出由2个数字组成的最小的倍数就可以了。

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define clr(a) memset(a,0,sizeof(a))typedef long long ll;struct nd{    char x;    int mx,sx;    int fa;}qe[200010];int _hd,_tl;int bd[70010],_bd=0;int _ck(int x,int a){    int _a=a%x,r=1;    ++_bd;    while(1){        if(bd[_a]==_bd)return 0;        if(!_a)return r;        bd[_a]=_bd,++r;        _a=(_a*10+a)%x;    }};int szle;char sz[70010];void _psh(int x){    if(qe[x].fa)_psh(qe[x].fa);    sz[qe[x].mx]=qe[x].x;};char tz[70010];void __psh(int x){        if(qe[x].fa)__psh(qe[x].fa);    tz[qe[x].mx]=qe[x].x;};bool _mp(){    int i;    for(i=1;sz[i]==tz[i];++i);    return tz[i]<sz[i];};void __ck(int x,int a,int b){    _hd=0,_tl=1;    qe[0].mx=0;qe[0].sx=x;    ++_bd;    bool fg=0;int i,t;    for(;_hd<_tl;++_hd){        if(bd[qe[_hd].sx]==_bd)continue;        if(!qe[_hd].sx)break;        bd[qe[_hd].sx]=_bd;        t=(qe[_hd].sx*10+a)%x;        if(bd[t]!=_bd){            qe[_tl].fa=_hd;            qe[_tl].sx=t;            qe[_tl].x=char(a+'0');            qe[_tl].mx=qe[_hd].mx+1;            ++_tl;            if(!_hd&&!a)--_tl;        }        t=(qe[_hd].sx*10+b)%x;        if(bd[t]!=_bd){            qe[_tl].fa=_hd;            qe[_tl].sx=t;            qe[_tl].x=char(b+'0');            qe[_tl].mx=qe[_hd].mx+1;            ++_tl;            if(!_hd&&!b)--_tl;        }    }    if(_hd!=_tl){        if(!szle)szle=qe[_hd].mx,_psh(_hd);        else{            if(szle>qe[_hd].mx)szle=qe[_hd].mx,_psh(_hd);            else{                if(szle==qe[_hd].mx){                    __psh(_hd);                    if(_mp()){                        for(i=1;i<=szle;++i)                            sz[i]=tz[i];                    }                }            }        }    }};int n;bool cl(){    scanf("%d",&n);    if(!n)return 0;    int i,t,le=0;char ri;bool fg=0;    for(i=1;i<10;++i){        t=_ck(n,i);        if(!le)            le=t,ri=char(i+'0');        else if(t&&le>t)            le=t,ri=char(i+'0');    }    if(le){        for(i=0;i<le;putchar(ri),++i);        putchar('\n');    }    else{        szle=0;        for(i=0;i<10;++i)for(t=i+1;t<10;++t)            __ck(n,i,t);        for(i=1;i<=szle;putchar(sz[i++]));        putchar('\n');    }    return 1;};int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);#endif    while(cl());    return 0;};
0 0
原创粉丝点击