51nod 1109 01组成的N的倍数

来源:互联网 发布:seo关键词优化工具 编辑:程序博客网 时间:2024/05/20 08:21

这里写图片描述

这个题我是用广搜做的,话题里面的抽屉原理没有想到怎么做。
搜索的时候节点记录两个值,一个是余数,一个是节点的编号,因为这是一颗二叉树,节点编号的二进制形式,刚好是我们需要的结果。对于余数,还要开一个数组去重。

#include<cstdio>#include<queue>#include<iostream>using namespace std;const int maxn = 1e6 + 5;bool f[maxn];int n;struct p{    long long value, num;}a;void print(long long k){    if(k <= 1) printf("%lld", k);    else{        print(k / 2);        printf("%lld", k % 2);    }}void bfs(){    a.value = 1;    a.num = 1;    queue<p> q;    q.push(a);    while(!q.empty()){        long long t = q.front().value;        long long nu = q.front().num;        q.pop();        int s = t * 10 % n;        if(s == 0){            print(nu * 2);            return;        }else{            if(f[s] == 0){                  f[s] = 1;                a.value = s;                a.num = nu * 2;                q.push(a);            }        }        s = (t * 10 + 1) % n;        if(s == 0){            print(nu * 2 + 1);            return;        }else{            if(f[s] == 0){                f[s] = 1;                a.value = s;                a.num = nu * 2 + 1;                q.push(a);            }        }    }}int main(){    scanf("%d", &n);    bfs();    return 0;}
原创粉丝点击