ACM-ICPC徐州赛区网络预赛 A题Hard to prepare(线性代数解法)

呃…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=12kM(j;x)f[i1,x].
则: f ⃗ [ i ] = M f ⃗ [ i − 1 ] , M = \vec{f}[i]=M\vec{f}[i-1],M= f [i]=Mf [i1],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 0111101111011110
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=JI,MN=(JI)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=nK1Jn(K1).
证明:略.
所以
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=0N(iN)Ji(I)Ni)=2k(i=1N(iN)(1)Ni2k(i1)+(1)N)i=0N1(iN)(1)i2k(Ni)+(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=12kM(j;x)f[i1,x].
则: f ⃗ [ i ] = M f ⃗ [ i − 1 ] , M = \vec{f}[i]=M\vec{f}[i-1],M= f [i]=Mf [i1],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 1110111111010111
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=JIr,MN=(JIr)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=nK1Jn(K1).
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=0N(iN)Ji(Ir)Ni)=2k(i=1N(iN)(1)Ni2k(i1)+(1)N[N])i=0N1(iN)(1)i2k(Ni)+(1)N2k[N]=i=0N1(iN)(1)i2k(Ni)+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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值