Find The Multiple
Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 19219 | Accepted: 7790 | Special Judge |
Description
Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100 decimal digits.
Input
The input file may contain multiple test cases. Each line contains a value of n (1 <= n <= 200). A line containing a zero terminates the input.
Output
For each value of n in the input print a line containing the corresponding value of m. The decimal representation of m must not contain more than 100 digits. If there are multiple solutions for a given value of n, any one of them is acceptable.
Sample Input
2 6 19 0
Sample Output
10 100100100100100100 111111111111111111
题意:
找n的倍数,并且全由01组成
题解:
很容易想到bfs,第1位必须是1,后面的可以是0,也可以是1.
bfs代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
int n;
queue<long long> q;
void BFS()
{
while(!q.empty())
q.pop();
long long k=1;
if(n==1)
{
printf("1\n");
return;
}
q.push(k);
while(!q.empty())
{
k=q.front();
q.pop();
if(k*10%n)
{
q.push(k*10);
}
else
{
printf("%I64d\n",k*10);
return;
}
if((k*10+1)%n)
{
q.push(k*10+1);
}
else
{
printf("%I64d\n",k*10+1);
return;
}
}
}
int main()
{
while(~scanf("%d",&n)&&n)
{
BFS();
}
}
在网上有看到用同余数定理来优化处理大数问题的,就研究了下。
同余数定理
(a*b)%n = (a%n *b%n)%n
(a+b)%n = (a%n +b%n)%n
于是
(k*10+1)%n==((k%n)*10+1)%n
(k*10)%n==(k%n)*10%n
这样就可以避免大数问题了,但是,用了同余定理后怎么把原来的数复原,这时候就要借助数组了,由于是双入口,可以借助满二叉树的性质,mod[i]=(mod[i/2]*10+i%2)%n。最后再把i转化为二进制就是路径也就是答案了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=800000+100;
int mod[maxn];
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
mod[0]=0;
mod[1]=1%n;
int i=1;
while(mod[i])
{
i++;
mod[i]=(mod[i/2]*10+i%2)%n;//模拟了BFS的双入口搜索
}
int cur=0;
while(i)
{
mod[cur++]=i%2;
i=i>>1;
}
for(int i=cur-1;i>=0;i--)//逆序输出
printf("%d",mod[i]);
printf("\n");
}
return 0;
}