這個題我是用廣搜做的,話題裏面的抽屜原理沒有想到怎麼做。
搜索的時候節點記錄兩個值,一個是餘數,一個是節點的編號,因爲這是一顆二叉樹,節點編號的二進制形式,剛好是我們需要的結果。對於餘數,還要開一個數組去重。
#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;
}