/**
题意: 给你一个数n,求出n的倍数m,要求m的十进制必须全部由1和0组成
题解: 首先可以用BFS来求这个m 第一个位置(最高位)必须为1(因为是10进制首位为0就没有意义了)
于是对于下一个位置就有0,1两种方向 这个数的大小为 num[i/2]*10+num[i]
由于这个数可能会很大,当递归层数到达10层时就会爆int。
发现要求n的倍数 m 则 m%n == 0, 于是我们只需要用num存储 m % n 的余数就可以了.
但是递归深度呢,这个只能测试下.毕竟n最大只有200 (num的数组大小 = 2 ^ (hight - 1) );
怎么感觉有点像Huffman树 2333
*/
/**
wtf!
6e5:
memset : 532ms
不用: 32ms
....为什么会相差这么多
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 6e5; ///经过测试当n = 198 二叉树的高度为 19 n = 2^19 < 6e5
int mod[maxn];
vector<int> ans;
int main()
{
int n;
while(~scanf("%d",&n),n)
{
ans.clear();
//memset(mod,0,sizeof(mod)); //虽然这个没必要初始化
mod[1] = 1 % n;
int i;
for(i=2;mod[i-1];i++) mod[i] = (mod[i/2]*10+i%2)%n;
i--;
while(i)
{
ans.push_back( i % 2);
i /= 2;
}
for(int i=ans.size()-1;i>=0;i--) printf("%d",ans[i]);
printf("\n");
}
return 0;
}
POJ1426-Find The Multiple(二叉树BFS + 同余定理)
最新推荐文章于 2021-04-06 20:18:11 发布