呃…csdn挂了一天了,都上传不了文档
(ICPC18徐州A)求n元环相邻元素同或不为零的方案.
\text{(ICPC18徐州A)求n元环相邻元素同或不为零的方案.}
(ICPC18徐州A)求n元环相邻元素同或不为零的方案.
如果从大家的思路来看,异或结果与同或结果只差一个奇数(有人说是偶数,我算了一下…貌似是奇数!)方案的 2 k 2^k 2k.现在考虑异或方案.
设
M
M
M是
2
k
2^k
2k阶矩阵,若
f
(
i
,
j
)
f(i,j)
f(i,j)代表选择到前
i
i
i个元素时末位为第
j
j
j个假面的方案数,那么若
f
[
i
,
j
]
=
∑
x
=
1
2
k
M
(
j
;
x
)
f
[
i
−
1
,
x
]
\displaystyle f[i,j]=\sum_{x=1}^{2^{k}}M(j;x)f[i-1,x]
f[i,j]=x=1∑2kM(j;x)f[i−1,x].
则:
f
⃗
[
i
]
=
M
f
⃗
[
i
−
1
]
,
M
=
\vec{f}[i]=M\vec{f}[i-1],M=
f[i]=Mf[i−1],M=
⟮
0
1
1
…
1
1
0
1
…
1
1
1
0
…
1
⋮
⋮
⋮
⋱
⋮
1
1
1
…
0
⟯
\left\lgroup\begin{array}{ccccc} 0&1&1&\dots&1\\ 1&0&1&\dots&1\\ 1&1&0&\dots&1\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ 1&1&1&\dots&0&\\ \end{array}\right\rgroup
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧011⋮1101⋮1110⋮1………⋱…111⋮0⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫
f
⃗
[
N
+
1
]
=
M
N
f
⃗
[
1
]
\vec{f}[N+1]=M^{N}\vec{f}[1]
f[N+1]=MNf[1],那么原题即是求
t
r
(
M
N
)
\mathrm{tr}(M^{N})
tr(MN).
令
J
J
J为
2
k
2^k
2k阶全1矩阵,
I
I
I为
2
k
2^k
2k阶单位矩阵,则
M
=
J
−
I
,
M
N
=
(
J
−
I
)
N
M=J-I,M^{N}=(J-I)^{N}
M=J−I,MN=(J−I)N.
Theorem
J
n
K
=
n
K
−
1
J
n
(
K
≥
1
)
\text{Theorem }J_n^{K}=n^{K-1}J_n(K\geq1)
Theorem JnK=nK−1Jn(K≥1).
证明:略.
所以
t
r
(
M
N
)
=
t
r
(
∑
i
=
0
N
(
N
i
)
J
i
(
−
I
)
N
−
i
)
=
2
k
(
∑
i
=
1
N
(
N
i
)
(
−
1
)
N
−
i
2
k
(
i
−
1
)
+
(
−
1
)
N
)
=
∑
i
=
0
N
−
1
(
N
i
)
(
−
1
)
i
2
k
(
N
−
i
)
+
(
−
1
)
N
2
k
.
\displaystyle \begin{aligned}\mathrm{tr}(M^{N})=&\mathrm{tr}(\sum_{i=0}^{N}\binom{N}{i}J^{i}(-I)^{N-i})= 2^{k}(\sum_{i=1}^{N}\binom{N}{i}(-1)^{N-i}2^{k(i-1)}+(-1)^{N})\\ =&\sum_{i=0}^{N-1}\binom{N}{i}(-1)^{i}2^{k(N-i)}+(-1)^{N}2^{k}. \end{aligned}
tr(MN)==tr(i=0∑N(iN)Ji(−I)N−i)=2k(i=1∑N(iN)(−1)N−i2k(i−1)+(−1)N)i=0∑N−1(iN)(−1)i2k(N−i)+(−1)N2k..
但是显然这样是不能体现我们暴力做题的强大威力.
设
M
M
M是
2
k
2^k
2k阶矩阵,若
f
(
i
,
j
)
f(i,j)
f(i,j)代表选择到前
i
i
i个元素时末位为第
j
j
j个假面的方案数,那么若
f
[
i
,
j
]
=
∑
x
=
1
2
k
M
(
j
;
x
)
f
[
i
−
1
,
x
]
\displaystyle f[i,j]=\sum_{x=1}^{2^{k}}M(j;x)f[i-1,x]
f[i,j]=x=1∑2kM(j;x)f[i−1,x].
则:
f
⃗
[
i
]
=
M
f
⃗
[
i
−
1
]
,
M
=
\vec{f}[i]=M\vec{f}[i-1],M=
f[i]=Mf[i−1],M=
⟮
1
1
1
…
0
1
1
1
…
1
1
1
0
…
1
⋮
⋮
⋮
0
1
1
…
1
⟯
\left\lgroup\begin{array}{ccccc} 1&1&1&\dots&0\\ 1&1&1&\dots&1\\ 1&1&0&\dots&1\\ \vdots&&\vdots&&\vdots\\ 0&1&1&\dots&1&\\ \end{array}\right\rgroup
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧111⋮01111110⋮1…………011⋮1⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫
f
⃗
[
N
+
1
]
=
M
N
f
⃗
[
1
]
\vec{f}[N+1]=M^{N}\vec{f}[1]
f[N+1]=MNf[1],那么原题即是求
t
r
(
M
N
)
\mathrm{tr}(M^{N})
tr(MN).
令
J
J
J为
2
k
2^k
2k阶全1矩阵,
I
r
I_r
Ir为
2
k
2^k
2k阶斜单位矩阵,则
M
=
J
−
I
r
,
M
N
=
(
J
−
I
r
)
N
M=J-I_r,M^{N}=(J-I_r)^{N}
M=J−Ir,MN=(J−Ir)N.
Theorem
J
n
K
=
n
K
−
1
J
n
(
K
≥
1
)
\text{Theorem }J_n^{K}=n^{K-1}J_n(K\geq1)
Theorem JnK=nK−1Jn(K≥1).
Theorem
I
r
K
=
I
r
,
K
是
奇
数
,
否
则
I
r
K
=
I
\text{Theorem }I_r^{K}=I_r,K是奇数,否则I_r^{K}=I
Theorem IrK=Ir,K是奇数,否则IrK=I.
所以
t
r
(
M
N
)
=
t
r
(
∑
i
=
0
N
(
N
i
)
J
i
(
−
I
r
)
N
−
i
)
=
2
k
(
∑
i
=
1
N
(
N
i
)
(
−
1
)
N
−
i
2
k
(
i
−
1
)
+
(
−
1
)
N
[
N
是
偶
数
]
)
=
∑
i
=
0
N
−
1
(
N
i
)
(
−
1
)
i
2
k
(
N
−
i
)
+
(
−
1
)
N
2
k
[
N
是
偶
数
]
=
∑
i
=
0
N
−
1
(
N
i
)
(
−
1
)
i
2
k
(
N
−
i
)
+
2
k
[
N
是
偶
数
]
\displaystyle \begin{aligned} \mathrm{tr}(M^{N})=&\mathrm{tr}(\sum_{i=0}^{N}\binom{N}{i}J^{i}(-I_r)^{N-i})=2^{k}(\sum_{i=1}^{N}\binom{N}{i}(-1)^{N-i}2^{k(i-1)}+(-1)^{N}[N是偶数])\\ =&\sum_{i=0}^{N-1}\binom{N}{i}(-1)^{i}2^{k(N-i)}+(-1)^{N}2^{k}[N是偶数]=\sum_{i=0}^{N-1}\binom{N}{i}(-1)^{i}2^{k(N-i)}+2^{k}[N是偶数] \end{aligned}
tr(MN)==tr(i=0∑N(iN)Ji(−Ir)N−i)=2k(i=1∑N(iN)(−1)N−i2k(i−1)+(−1)N[N是偶数])i=0∑N−1(iN)(−1)i2k(N−i)+(−1)N2k[N是偶数]=i=0∑N−1(iN)(−1)i2k(N−i)+2k[N是偶数].
没有任何分类讨论,可以说是很优雅了~
#include <cstdio>
const long long mod=1000000007;
long long qp(long long a,long long b){
long long res=1;
while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}
return res;
}
int main(){
int T;long long n,k;
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&n,&k);
long long _2k=qp(2,k),res=qp((_2k-1+mod)%mod,n);
if((n&1)==0)res+=_2k-1;else res++;
printf("%lld\n",(res+mod)%mod);
}
}