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
的倍数来解决问题,然后成功的没跑出来,这题用状态就很简单,因为
具体思路如下:
假设前面为的01排列的余为
M
如果我们在后边添一个
那么余数成为
M∗10modN
如果我们在后边添一个
1
那么余数成为
如果余数为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;
}