欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ1426-Find The Multiple(BFS+同余)

程序员文章站 2022-03-13 23:52:38
...

题目链接
题意:找出一个n的倍数,这个数只含1和0。

参考博客

题记:可以用BFS的思想去做,每位数只有1和0两种情况(第一位必须是1)。那么我们BFS时是类似于一个二叉树的形状(最好画图理解)

同余定理:
(a*b)%n = (a%n *b%n)%n
(a+b)%n = (a%n +b%n)%n

具体证明可以看上面的参考博客。

下图可做参考(字有些难看 )。
图中n取6,黑体字为当前数字,红体字为当前数字余6的余数,蓝体字是当前数字的序号(BFS的顺序)。可以看出是和二叉树是一样的,所以可以用二叉树的性质去做。每个节点(除了父节点)都是由父节点10或10+1得到的,[i/2]10和[i/2]10+1。序号是偶数是10,序号是奇数是10+1。
POJ1426-Find The Multiple(BFS+同余)

#include<iostream>
#include<cstring>
using namespace std;
const int N=1e6;
int mod[N];//mod数组存余数
int main(){
    int n;
    while(cin>>n){
        if(!n) break;
        mod[1]=1%n;//最高位必定是1
        int i;
        //cout<<mod[1]<<' ';
        for(i=2;mod[i-1]!=0;i++){
            mod[i]=(mod[i/2]*10+i%2)%n;
            //类似于线段树的建树过程的BFS
            //cout<<mod[i]<<' ';
        }
        //cout<<endl;
        i--;
        //cout<<i<<endl;
        int temp=0;
        while(i){
            mod[temp++]=i%2;
            //在二叉树编号为偶数的填0
            //奇数的填1
            i/=2;
        }
        while(temp)
            cout<<mod[--temp];
        cout<<endl;
    }
    return 0;
}