首页 > 代码库 > POJ 1426 Find The Multiple(寻找倍数)

POJ 1426 Find The Multiple(寻找倍数)

<style>p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Roman" } span.15 { font-family: Tahoma; font-size: 9.0000pt } span.16 { font-family: 宋体; font-size: 12.0000pt } p.pre { margin-bottom: 0.0000pt; font-family: 宋体; font-size: 12.0000pt } p.18 { margin-bottom: 10.0000pt; text-indent: 21.0000pt; font-family: Tahoma; font-size: 11.0000pt } p.MsoAcetate { margin-bottom: 0.0000pt; font-family: Tahoma; font-size: 9.0000pt } span.msoIns { text-decoration: underline; color: blue } span.msoDel { text-decoration: line-through; color: red } table.MsoNormalTable { font-family: "Times New Roman"; font-size: 10.0000pt } table.MsoTableGrid { font-family: "Times New Roman"; font-size: 10.0000pt } div.Section0 { }</style>

POJ 1426 Find The Multiple(寻找倍数)

Time Limit: 1000MS    Memory Limit: 65536K

 

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.

技术分享
给定一个整数n,敲个代码来找出n的仅有数字0和1构成的非零倍数m。你可以认为n不超过200且m不超过100个十进制数。
CN

 

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.

技术分享
多组测试用例。每行有一个数n (1 <= n <= 200)。某行一个0为输入结束。
CN

 

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.

技术分享
对于每个输入的n,输出一行m。十进制数m必须不能超过100位。如果对于n存在多解,则随便输出一种。
CN

 

Sample Input - 输入样例

2
6
19
0

 

Sample Output - 输出样例

10
100100100100100100
111111111111111111

 

题解

  刚刚开始在想直接2^100可能有点问题,打算模拟除法来做…………然而水平太渣,写条件真是要死要活。(虽然可以出结果但是回溯/转移的时候没考虑好导致长度有问题……)
  发觉讨论里表示可以直接暴力出来……然后发现…………居然可以?!
  (估计数据不多)
  从100位开始发现可以刚好剪到19位,int64范围。
  不过似乎由于编译器对自动转换的支持问题,提交的时候要手动弄好int64才可以。

 

代码 C++

 1 #include <cstdio>
 2 __int64 isFid, n;
 3 void DFS(__int64 now, int len){
 4     if (!isFid || len > 18) return;
 5     if (isFid = now%n){
 6         DFS(now * 10, len + 1); DFS(now * 10 + 1, len + 1);
 7     }
 8     else printf("%I64d\n", now);
 9 }
10 int main(){
11     while (scanf("%I64d", &n), isFid = n) DFS(1, 0);
12     return 0;
13 }

 

POJ 1426 Find The Multiple(寻找倍数)