POJ 1426 Find The Multiple(不断学习!)

来源:互联网 发布:淘宝确认收货后退运费 编辑:程序博客网 时间:2024/05/17 22:56

【题意简述】:输入一个数,找出它的一个倍数,这个倍数只能用0和1表示。

【思路】:一开始想到的是用简单的朴素的BFS,用队列帮助实现,可是超时!这个是超时代码:

#include<iostream>#include<cstring>#include<queue>using namespace std;__int64 bfs(int m){queue<__int64> q;__int64 temp;q.push(1);while(!q.empty()){temp = q.front();q.pop();if(temp%m == 0)return temp;q.push(temp*10+1);q.push(temp*10);}return 0;}int main(){int n;while(cin>>n&&n){cout<<bfs(n)<<endl;}return 0;}

后来学习别人的解题报告找到优化的方法!每一步都可以取余,解决了大数问题!这个代码是别人的:優YoU  http://user.qzone.qq.com/289065406/blog/1303946967

//Memory Time//2236K  32MS #include<iostream>using namespace std;int mod[524286];  //保存每次mod n的余数                  //由于198的余数序列是最长的                  //经过反复二分验证,436905是能存储198余数序列的最少空间                  //但POJ肯定又越界测试了...524286是AC的最低下限,不然铁定REint main(int i){int n;while(cin>>n){if(!n)break;mod[1]=1%n;  //初始化,n倍数的最高位必是1for(i=2;mod[i-1]!=0;i++)  //利用同余模定理,从前一步的余数mod[i/2]得到下一步的余数mod[i]mod[i]=(mod[i/2]*10+i%2)%n;             //mod[i/2]*10+i%2模拟了BFS的双入口搜索             //当i为偶数时,+0,即取当前位数字为0  。为奇数时,则+1,即取当前位数字为1i--;int pm=0;while(i){mod[pm++]=i%2;   //把*10操作转化为%2操作,逆向求倍数的每一位数字i/=2;}while(pm)cout<<mod[--pm];  //倒序输出cout<<endl;}return 0;}


这个代码也是可以AC的:From: http://www.cnblogs.com/crazyapple/archive/2013/06/03/3116169.html

#include<iostream>#include<stdio.h>#include<string.h>#include<queue>using namespace std;  __int64 mod[600000]; int main(){     int n;     while(~scanf("%d",&n)&&n)     {         int i;         for(i=1;;i++)         {             mod[i]=mod[i/2]*10+i%2;             if(mod[i]%n==0)             {                 break;             }         }         printf("%I64d\n",mod[i]);     }     return 0;}



0 0
原创粉丝点击