题目大意
有一个n 维向量空间,从这里面拿出n个01向量,设fn为选出的这n个01向量相互线性独立的概率,求 f1^ f2^...^ fn 的值。
思路
有n个向量,它们都线性无关,所以它们的空间秩也是n。每次随机的向量都会加入之前的向量空间,那么每一个向量都一定不属于之前的空间,则一共有2n个向量。
观察规律不难得到对于每个i,都有2i个向量线性相关,那么反之则有2n-2i个向量线性无关。那么有:
[图片缺失] 原图:https://www.edisoncgh.com/wp-content/uploads/2020/07/image-1.png
递推计算出每个f就行了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e7 + 10;
const ll MOD = 1e9 + 7;
const ll INF = 500000004;
int t;
ll n, f[N];
int main()
{
f[1] = INF;
ll x = INF, y = 1;
for ( int i = 2; i <= N; i++ )
{
x = x * f[1] % MOD;
y = (y * 2 + 1) % MOD;
f[i] = (f[i - 1] * y) % MOD * x % MOD;
}
for ( int i = 2; i < N; i++ )
f[i] ^= f[i - 1];
cin >> t;
while ( t-- )
{
scanf("%lld", &n);
printf("%lld\n", f[n]);
}
return 0;
}