首页 > 其他 > 详细

poj 1426 Find The Multiple

时间:2015-08-11 11:43:19      阅读:201      评论:0      收藏:0      [点我收藏+]

题意:

给出一个数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;
}

poj 1426 Find The Multiple

原文:http://www.cnblogs.com/jihe/p/4720333.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!