poj 1426 Find The Multiple(搜索BFS的思想+ 同余模定理+二叉树+01哈夫曼编码)

http://poj.org/problem?id=1426

Find The Multiple
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 14519   Accepted: 5893   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

思路:

这里结果只有01,所以首先想到的是用二叉树的结构,

 而又由于结果是一个01序列,那能不能把 *10得到k每一位的问题 转化为模2的操作得到k的每一位(0或1) 呢?

答案是可以的

首先我们利用 同余模定理 对得到余数的方式进行一个优化

(a*b)%n = (a%n *b%n)%n

(a+b)%n = (a%n +b%n)%n

 

代码1:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<queue>
 5 using namespace std;
 6 
 7 int mod[600000];
 8 int res[200];
 9 
10 int main()
11 {
12     int n;
13     while(~scanf("%d",&n)&&n)
14     {
15         mod[1]=1%n;  //初始化,n倍数的最高位必是1
16         int i;
17 
18         for(i=2;mod[i-1];i++)
19         {
20             //利用同余模定理,从前一步的余数mod[i/2]得到下一步的余数mod[i]
21             //mod[i/2]*10+i%2模拟了BFS的双入口搜索
22             mod[i]=(mod[i/2]*10+i%2)%n;
23         }
24         int id=0;
25         i--;
26         while(i)  //像哈夫曼编码一样的,倒着求根节点的01编码
27         {
28             res[id++]=i%2;
29             i/=2;
30         }
31         for(i=id-1;i>=0;i--)  //倒序输出
32         {
33             printf("%d",res[i]);
34         }
35         putchar(10);
36     }
37     return 0;
38 }

看来想得有点多了(下面这代码居然AC了)

代码2:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<queue>
 5 using namespace std;
 6 
 7 __int64 mod[600000];
 8 
 9 int main()
10 {
11     int n;
12     while(~scanf("%d",&n)&&n)
13     {
14         int i;
15         for(i=1;;i++)
16         {
17             mod[i]=mod[i/2]*10+i%2;
18             if(mod[i]%n==0)
19             {
20                 break;
21             }
22         }
23         printf("%I64d\n",mod[i]);
24     }
25     return 0;
26 }

想不通用BFS直接写为什么会超时,用数组模拟的可以优化这么多?????

附上超时BFS代码(代码3)“下面代码poj超时”:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<queue>
 5 using namespace std;
 6 
 7 __int64 bfs(int m)
 8 {
 9     queue<__int64> q;
10     __int64 temp;
11     q.push(1);
12     while(!q.empty())
13     {
14         temp=q.front();
15         q.pop();
16         if(temp%m==0)
17             return temp;
18         q.push(temp*10+1);
19         q.push(temp*10);
20     }
21     return 0;
22 }
23 
24 int main()
25 {
26     int n;
27     while(~scanf("%d",&n)&&n)
28     {
29         printf("%I64d\n",bfs(n));
30     }
31     return 0;
32 }

 

 

 

原文地址:https://www.cnblogs.com/crazyapple/p/3116169.html