您的位置:首页 > 其它

poj 1426 Find The Multiple

2015-08-11 10:41 316 查看
题意:

给出一个数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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: