bfs的搜索树,也是一种完全二叉树。
又知道:
a
∗
b
a*b
a∗b%
m
=
(
a
m=(a
m=(a%
m
∗
b
m*b
m∗b%
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等等串都可以适用这一方法。