POJ 1426 Find The Multiple (BFS/二叉树+数论)

题目传送门

bfs的搜索树,也是一种完全二叉树。

在这里插入图片描述
又知道:
a ∗ b a*b ab% m = ( a m=(a m=(a% m ∗ b m*b mb% m ) m) m)% m ; m; m;
( a (a (a% m + b m+b m+b% m ) m) m)% m = ( a + b ) m=(a+b) m=(a+b)% m ; m; m;
本题的数字又是由一位一位的 0 / 1 0/1 0/1串组成的。
因此:
( ( ( 0 / 1 ) ∗ 1 + ( 0 / 1 ) ) ∗ 10 + ( 0 / 1 ) ) ∗ 100 (((0/1)*1+(0/1))*10+(0/1))*100 (((0/1)1+(0/1))10+(0/1))100% n = 0 n=0 n=0
等价于
( ( ( 0 / 1 ) ∗ 1 (((0/1)*1 (((0/1)1% n + ( 0 / 1 ) ) n+(0/1)) n+(0/1))% n ∗ ( 10 n*(10 n(10% n ) + ( 0 / 1 ) ) n)+(0/1)) n)+(0/1))% n ∗ ( 100 n*(100 n(100% n ) = 0 n)=0 n)=0

AC代码

#include<iostream>
#include<stack>
using namespace std;
int modd[602100];
stack<int>s;
int main(){
	int n;
	while(cin>>n&&n){
		int t=2;
		modd[1]=1;
		for(t;modd[t-1];t++){
			modd[t]=(modd[t/2]*10+t%2)%n;
		}--t;
		while(t){
			s.push(t%2);
			t/=2;
		}
		while(s.size()){
			cout<<s.top();
			s.pop();
		}
		cout<<"\n";
	}
}

这句话我来解释一下

modd[t]=(modd[t/2]*10+t%2)%n;

t枚举的是二叉树每一个节点的下标t/2访问的就是父节点,t%2就是看这个点加不加1,详见下图
在这里插入图片描述
下标的奇偶性决定这一位是1还是0!
那么这个问题可以推广不止01串,012 ,0123等等串都可以适用这一方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值