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

Statement

在这里插入图片描述

题解

  • 由于这 n n 个向量线性无关
  • 所以它们张成了满秩空间( N N 维)
  • 每一个向量都不属于之前的空间
  • 总共 2 N 2^N 个向量
  • N = 1 N=1 时,设取到向量   a ~\vec{a}
  • 共有 2 2 个向量与它线性相关:   a ~\vec{a}   0 ~\vec{0}
  • N = 2 N=2 时,设取到向量   a   b ~\vec{a}~\vec{b}
  • 共有 4 4 个向量与它们线性相关:   a ~\vec{a} ,   b ~\vec{b} ,   a + b ~\vec{a}+\vec{b} ,   0 ~\vec{0}
  • N = 3 N=3 时,设取到向量   a   b   c ~\vec{a}~\vec{b}~\vec{c}
  • 共有 8 8 个向量与它们线性相关:   a ~\vec{a} ,   b ~\vec{b} ,   c ~\vec{c} ,   a + b ~\vec{a}+\vec{b} ,   b + c ~\vec{b}+\vec{c} ,   a + c ~\vec{a}+\vec{c} ,   a + b + c ~\vec{a}+\vec{b}+\vec{c} ,   0 ~\vec{0}
  • . . . ...
  • 以此类推,当 N = i N=i 时,有 2 i 2^i 个向量线性相关
  • 就有 2 N 2 i 2^N-2^i 个向量线性无关
  • 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}

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}

= 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 = 1 n 2 i 1 2 i \,\qquad=\mathop{\prod}\limits_{i=1}^n\cfrac{2^i-1}{2^i}

  • 然后就可以递推了

代码

#include <cstdio>
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]);
}

猜你喜欢

转载自blog.csdn.net/ding_ning123/article/details/107616904