Statement
题解
- 由于这
n个向量线性无关
- 所以它们张成了满秩空间(
N维)
- 每一个向量都不属于之前的空间
- 总共
2N个向量
- 当
N=1时,设取到向量
a
- 共有
2个向量与它线性相关:
a
和
0
- 当
N=2时,设取到向量
a
b
- 共有
4个向量与它们线性相关:
a
,
b
,
a
+b
,
0
- 当
N=3时,设取到向量
a
b
c
- 共有
8个向量与它们线性相关:
a
,
b
,
c
,
a
+b
,
b
+c
,
a
+c
,
a
+b
+c
,
0
-
...
- 以此类推,当
N=i时,有
2i个向量线性相关
- 就有
2N−2i个向量线性无关
-
P(linear independent)=2n2n−2i
f(n)=i=1∏n2n2n−2i
=i=1∏n2n−i2n−i−1
=i=1∏n2i2i−1
代码
#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]);
}