您的位置:首页 > 其它

POJ1426-Find The Multiple(二叉树BFS + 同余定理)

2017-11-26 12:15 411 查看
/**
题意: 给你一个数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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: