POJ-1426 Find The Multiple

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
2
6
19
0
Sample Output
10
100100100100100100
111111111111111111

解决思路

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

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

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

如果余数为0
那么可以坑定是这个01排列是 N <script type="math/tex" id="MathJax-Element-10">N</script>的倍数

代码

/*********************************
Author: Toudsour
Created Time: 日 11/ 1 23:08:09 2015
File Name:POJ1426.cpp
*********************************/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define MAX 300
int 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值