牛客多校第六场B-Binary Vector(线性代数linear algebra)

Statement

牛客多校第六场B-Binary Vector(线性代数linear algebra)_第1张图片

题解

  • 由于这 n n n个向量线性无关
  • 所以它们张成了满秩空间( N N N维)
  • 每一个向量都不属于之前的空间
  • 总共 2 N 2^N 2N个向量
  • N = 1 N=1 N=1时,设取到向量   a ⃗ ~\vec{a}  a
  • 共有 2 2 2个向量与它线性相关:   a ⃗ ~\vec{a}  a   0 ⃗ ~\vec{0}  0
  • N = 2 N=2 N=2时,设取到向量   a ⃗   b ⃗ ~\vec{a}~\vec{b}  a  b
  • 共有 4 4 4个向量与它们线性相关:   a ⃗ ~\vec{a}  a ,   b ⃗ ~\vec{b}  b ,   a ⃗ + b ⃗ ~\vec{a}+\vec{b}  a +b ,   0 ⃗ ~\vec{0}  0
  • N = 3 N=3 N=3时,设取到向量   a ⃗   b ⃗   c ⃗ ~\vec{a}~\vec{b}~\vec{c}  a  b  c
  • 共有 8 8 8个向量与它们线性相关:   a ⃗ ~\vec{a}  a ,   b ⃗ ~\vec{b}  b ,   c ⃗ ~\vec{c}  c ,   a ⃗ + b ⃗ ~\vec{a}+\vec{b}  a +b ,   b ⃗ + c ⃗ ~\vec{b}+\vec{c}  b +c ,   a ⃗ + c ⃗ ~\vec{a}+\vec{c}  a +c ,   a ⃗ + b ⃗ + c ⃗ ~\vec{a}+\vec{b}+\vec{c}  a +b +c ,   0 ⃗ ~\vec{0}  0
  • . . . ... ...
  • 以此类推,当 N = i N=i N=i时,有 2 i 2^i 2i个向量线性相关
  • 就有 2 N − 2 i 2^N-2^i 2N2i个向量线性无关
  • P ( l i n e a r   i n d e p e n d e n t ) = 2 n − 2 i 2 n P(linear~independent)=\cfrac{2^n-2^i}{2^n} P(linear independent)=2n2n2i

f ( n ) = ∏ i = 1 n 2 n − 2 i 2 n f(n)=\mathop{\prod}\limits_{i=1}^n\cfrac{2^n-2^i}{2^n} f(n)=i=1n2n2n2i

  = ∏ i = 1 n 2 n − i − 1 2 n − i \,\qquad=\mathop{\prod}\limits_{i=1}^n\cfrac{2^{n-i}-1}{2^{n-i}} =i=1n2ni2ni1

  = ∏ i = 1 n 2 i − 1 2 i \,\qquad=\mathop{\prod}\limits_{i=1}^n\cfrac{2^i-1}{2^i} =i=1n2i2i1

  • 然后就可以递推了

代码

#include 
const int N=2e7,mod=1e9+7;
int T,n,mul[N],inv[N],ans[N];
int ksm(int a,int b){
	int r=1;
	while(b){if(b&1)r=1ll*r*a%mod;a=1ll*a*a%mod,b>>=1;}
	return r;
}int main(){
	mul[0]=1;
	for(int i=1;i<=N;i++) mul[i]=2ll*mul[i-1]%mod;
	inv[N]=ksm(mul[N],mod-2);
	for(int i=N-1;i;i--) inv[i]=2ll*inv[i+1]%mod;
	int x=inv[1];ans[1]=inv[1];
	for(int i=2;i<=N;i++) 
		x=1ll*x*(mul[i]-1)%mod*inv[i]%mod,ans[i]=ans[i-1]^x;
	scanf("%d",&T);
	while(T--) scanf("%d",&n),printf("%d\n",ans[n]);
}

你可能感兴趣的:(2020牛客暑期多校训练营)