题意:
随机n个n维01向量,询问这个n个向量线性无关的概率?

思路:
观察样例,我们发现f(i)初始为1,分子开始乘1,分母乘2,然后每次乘前一次乘的2倍+1,分母每次乘前一次的二倍。
由于n<=2*10^7,所以我们打表。
我们先打出f(i)的表,f(1)=1/2的逆元ans[1]=500000004;
f(2)=1/2 * (1 * 2 +1)/(2 * 4)=1/2 * (1 * 2 +1) * (1/(2 * 4));
1/2的逆元为ans[1],1/4的逆元为ans[1] * ans[1],1/8的逆元为ans[1] * ans[1] * ans[1];
这样理解你就可以线性求出f(i)的逆元后的表。

代码:

#include <bits/stdc++.h>
#define ll long long
#define db double
#define iosks std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=2e7+10;
const ll mod=1e9+7;

ll pow2(ll a,ll b) {ll s=1; while(b) {if(b&1) s=(s*a)%mod; a=(a*a)%mod; b/=2; } return s;}

int T;
ll n,ans[N];

int main()
{
    iosks;
    ans[1]=500000004;
    ll pa=500000004, pan=1;
    for(int i=2;i<=N;i++)
    {
        pa=pa*ans[1]%mod;
        pan=(pan*2+1)%mod;
        ans[i]=(ans[i-1]*pan)%mod*pa%mod;
    }
    for(int i=2;i<N;i++) ans[i]=(ans[i]^ans[i-1]);
    cin>>T;
    while(T--){
        cin>>n;
        cout<<ans[n]<<endl;
    }
    return 0;
}