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
",ans[n]);
   }
   return 0;
}
原文地址:https://www.cnblogs.com/jihe/p/4720333.html