您的位置:首页 > 其它

POJ 1426(BFS+辗转相除法)

2018-02-01 14:54 78 查看
题目链接:点击打开链接

题目大意:找到一个可以整除n的,只含有1和0的正整数。

题目思路:刚开始很明显就想到,如果你用while然后从1开始一直++直到找到整除n的肯定是要超时的,然后题目给了条件只含有1和0,然后就会让人想到,一个非常非常多嵌套的for循环,然后测试每一种情况(00000001,00000010,00000011,00000100……),显然是不现实的。



重点来了

这道题出现在搜索专题刚开始就让我很纳闷..毕竟之前做过的搜索都是跟图论结合的....后来其实也是搜了下题解很好奇这个怎么用搜索做,其实说它不是搜索吧也确实是,它的思想就是跟队列一模一样的。

我来模拟一下它的过程。首先先在队列中放入1,看%n是否等于0,否的话,把1*10和1*10+1放入队列,把1扔出去,然后把1*10拉过来,%n不等于0的话再*10和*10+1放入队列,放在后面排队,吧1*10+1拉过来这样的话,队列中的数字分别是这样的(1)->(10,11)->(100,101,110,111),就这样就把所有的情况都考虑了很强势。

同时这道题有两个注意点:第一,有些数字特别大需要long long,比如n是198的时候,答案是1111111111111111110,爆int直接输出负的;第二,同样跟数字大有关,由于数字太大,所以取模需要用到辗转相除法,否则同样会超时。

以下附上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int gcd(long long a,long long b){
return b==0?a:gcd(b,a%b);
}
int main(){
int n;
long long temp;
queue<long long>q;
while(~scanf("%d",&n)&&n){
while(!q.empty()){
q.pop();
}
q.push(1);
while(!q.empty()){
temp=q.front();
q.pop();
if(temp%n!=0){
q.push(temp*10);
q.push(temp*10+1);
}
else{
break;
}
}
printf("%lld\n",temp);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息