POJ 1246 Find The Multiple

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

Source

 
思路:暴力BFS,使用一个数组记录每一位的直接前驱,但是这样的话,
数组需要的内存将会Fibonacci增长,显然会超内存,所以只能对于超内存
的单独打表if(n == 99)
           printf("111111111111111111 ");
        else
        {
        if(n == 198)
           printf("1111111111111111110 ");
哎好菜啊
 
 
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;
struct Node
{
    int x;
    int weizhi;
    int qquweizhi;
    int biji;
}map[100000];
int mmm[110];
int move[2] = {0,1};
int biji;
int weizhi;
int n;
void BFS(int x)
{
    queue < Node > q;
    map[1].x = x;map[1].weizhi = 1;map[1].qquweizhi = 0;map[1].biji = 0;
    q.push(map[1]);
    int bbbb = 0;
    while(1)
    {
        Node temp;temp = q.front();q.pop();
        if((temp.biji * 10 + temp.x) % n == 0)
        {
            weizhi = temp.weizhi;
            int aaa = 1;
            while(weizhi != 0)
            {
                mmm[aaa ++] = map[weizhi].x;
                weizhi = map[weizhi].qquweizhi;
            }
            aaa --;
            for(;aaa >= 1;aaa --)
                 printf("%d",mmm[aaa]);
            printf(" ");
            return ;
        }
        temp.biji = (temp.biji * 10 + temp.x) % n;
        int wei;
        for(int i = 0;i < 2;i ++)
        {
            int y = move[i];
            if(i == 0)
                 wei = temp.weizhi + bbbb + 1;
            else
                 wei = temp.weizhi + bbbb + 2;
            map[wei].x = y;map[wei].weizhi = wei;
            map[wei].qquweizhi = temp.weizhi;
            map[wei].biji = temp.biji;
            q.push(map[wei]);
        }
        bbbb ++;
    }
}
int main()
{
    while(scanf("%d",&n),n != 0)
    {
        memset(map,0,sizeof(map));
        if(n == 99)
           printf("111111111111111111 ");
        else
        {
        if(n == 198)
           printf("1111111111111111110 ");
        else
        {
          biji = 0;
          BFS(1);
        }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/GODLIKEING/p/3306664.html