题目大意
有一个n 维向量空间,从这里面拿出n个01向量,设fn为选出的这n个01向量相互线性独立的概率,求 f1^ f2^…^ fn 的值。
思路
有n个向量,它们都线性无关,所以它们的空间秩也是n。每次随机的向量都会加入之前的向量空间,那么每一个向量都一定不属于之前的空间,则一共有2n个向量。
观察规律不难得到对于每个i,都有2i个向量线性相关,那么反之则有2n-2i个向量线性无关。那么有:
递推计算出每个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; }
评论
还没有任何评论,你来说两句吧!