POJ-1426 Find The Multiple

来源:互联网 发布:c语言 string比较 编辑:程序博客网 时间:2024/06/09 18:43

POJ-1426 Find The Multiple

问题描述

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

26190

Sample Output

10100100100100100100111111111111111111

解决思路

我当时没有反应过来用状压,在那边暴力的打表,还用了最愚蠢的方法,枚举n的倍数来解决问题,然后成功的没跑出来,这题用状态就很简单,因为n的余数不会超过n种,而n也不会超过200,可以说相当少。
具体思路如下:
假设前面为的01排列的余为M

如果我们在后边添一个0
那么余数成为M10modN

如果我们在后边添一个1
那么余数成为(M10+1)modN

如果余数为0
那么可以坑定是这个01排列是N的倍数

代码

/*********************************Author: ToudsourCreated Time: 日 11/ 1 23:08:09 2015File Name:POJ1426.cpp*********************************/#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;#define MAX 300int DP[MAX][MAX];int Path[MAX][MAX];int Ans[MAX];int main(){    int N;    while(scanf("%d",&N)!=EOF&&N)    {        int Len=0;        int Next;        memset(DP,-1,sizeof(DP));        DP[1][1%N]=0;        Path[1][1%N]=1;        for(int i=1;i<=100;i++)        {            for(int j=1;j<=N;j++)            {                if(DP[i][j]!=-1)                {                    Next=j*10%N;                    DP[i+1][Next]=j;                    Path[i+1][Next]=0;                    Next=(j*10+1)%N;                    DP[i+1][Next]=j;                    Path[i+1][Next]=1;                }            }            if(DP[i][0]!=-1)            {                Len=i;                break;            }        }        Next=0;        for(int i=Len;i>=1;i--)        {           Ans[i]=Path[i][Next];           Next=DP[i][Next];        }        for(int i=1;i<=Len;i++)            printf("%d",Ans[i]);        printf("\n");    }    return 0;}
0 0
原创粉丝点击