您的位置:首页 > 其它

51nod 1109 01组成的N的倍数

2017-07-30 09:40 239 查看


这个题我是用广搜做的,话题里面的抽屉原理没有想到怎么做。

搜索的时候节点记录两个值,一个是余数,一个是节点的编号,因为这是一颗二叉树,节点编号的二进制形式,刚好是我们需要的结果。对于余数,还要开一个数组去重。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: