【51Nod 1109】01组成的N的倍数

Description

给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只包含0或1。求最小的M。
例如:N = 4,M = 100。

Solution

开始用深搜做了一下,结果不行,很显然不行,打开话题看了一下,改成用广搜做了一下。可以了!!

Code

#include
#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
using namespace std;
typedef long long ll;
int i,j,k,l,t,n,m,now;
queue<int> q;
int a[1000007],sh[1000007],b[1000007];
ll ans;
void gao(int x){
    while(x!=-1){
        b[++b[0]]=a[x];
        x=sh[x];    
    }
    fod(i,b[0],1)printf("%d",b[i]);
}
int main(){
    scanf("%d",&n);
    q.push(1);
    sh[1]=-1;
    a[1]=1;
    while(!q.empty()){
        now=q.front();
        q.pop();
        k=now*10%n;
        l=(now*10+1)%n;
        if(!k){
            gao(now);
            printf("0\n");
            break;
        }
        if(!l){
            gao(now);
            printf("1\n");
            break;
        }
        if(!sh[k]){
            q.push(k);
            sh[k]=now;
            a[k]=0;
        }
        if(!sh[l]){
            q.push(l);
            sh[l]=now;
            a[l]=1;
        }
    }
  //  printf("%lld\n",ans);
}

你可能感兴趣的:(noip,暴搜)