poj 1426 Find The Multiple
题意:
给出一个数n(n>0&&n<=200),有一个m(m>0),n*m组成的数是由0和1组成的十进制数,输出这个数n*m
分析:ans[i]表示i对应的答案,如果i是偶数,则i可以表示为2*k(k=i>>1),ans[i]=ans[k]*10,肯定符合题意(10/2=5)
如下:
if(i是奇数)
搜索答案;
if(i是偶数)
ans[i]=ans[i>>1]*10;
这样就可以把偶数的搜索减去了
搜索的方法就是遍历,每次把上一次的数分别*10 和*10+1检测是否符合题意(暴力)
代码:
#include<iostream>
using namespace std;
long long ans[205];
long long q[100000000];
long long dfs(int n)
{
int l,r;
l=r=0;
q[r++]=1;
while(1)
{
long long num=q[l++];
if((num*10)%n==0)
return num*10;
if((num*10+1)%n==0)
return num*10+1;
q[r++]=num*10;
q[r++]=num*10+1;
}
return -1;
}
int main()
{
ans[1]=1;
for(int i=2;i<=200;i++)
{
if(i&1)
ans[i]=dfs(i);
else
ans[i]=ans[i>>1]*10;
}
int n;
while(~scanf("%d",&n)&&n)
{
printf("%lld\n",ans[n]);
}
return 0;
}