【题意简述】:输入一个数,找出它的一个倍数,这个倍数只能用0和1表示。
【思路】:一开始想到的是用简单的朴素的BFS,用队列帮助实现,可是超时!这个是超时代码:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
__int64 bfs(int m)
{
queue<__int64> q;
__int64 temp;
q.push(1);
while(!q.empty())
{
temp = q.front();
q.pop();
if(temp%m == 0)
return temp;
q.push(temp*10+1);
q.push(temp*10);
}
return 0;
}
int main()
{
int n;
while(cin>>n&&n)
{
cout<<bfs(n)<<endl;
}
return 0;
}
//Memory Time
//2236K 32MS
#include<iostream>
using namespace std;
int mod[524286]; //保存每次mod n的余数
//由于198的余数序列是最长的
//经过反复二分验证,436905是能存储198余数序列的最少空间
//但POJ肯定又越界测试了...524286是AC的最低下限,不然铁定RE
int main(int i)
{
int n;
while(cin>>n)
{
if(!n)
break;
mod[1]=1%n; //初始化,n倍数的最高位必是1
for(i=2;mod[i-1]!=0;i++) //利用同余模定理,从前一步的余数mod[i/2]得到下一步的余数mod[i]
mod[i]=(mod[i/2]*10+i%2)%n;
//mod[i/2]*10+i%2模拟了BFS的双入口搜索
//当i为偶数时,+0,即取当前位数字为0 。为奇数时,则+1,即取当前位数字为1
i--;
int pm=0;
while(i)
{
mod[pm++]=i%2; //把*10操作转化为%2操作,逆向求倍数的每一位数字
i/=2;
}
while(pm)
cout<<mod[--pm]; //倒序输出
cout<<endl;
}
return 0;
}
这个代码也是可以AC的:From: http://www.cnblogs.com/crazyapple/archive/2013/06/03/3116169.html
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
__int64 mod[600000];
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
int i;
for(i=1;;i++)
{
mod[i]=mod[i/2]*10+i%2;
if(mod[i]%n==0)
{
break;
}
}
printf("%I64d\n",mod[i]);
}
return 0;
}
POJ 1426 Find The Multiple(不断学习!),布布扣,bubuko.com
POJ 1426 Find The Multiple(不断学习!)
原文:http://blog.csdn.net/u013749862/article/details/23021001