1. 程式人生 > 實用技巧 >Binary Vector【公式】-2020牛客暑期多校6

Binary Vector【公式】-2020牛客暑期多校6

題意:

分析:

當時時根據樣猜出的公式:\(f(n)=\frac{\prod_{n}^{i=1}{(2^i-1)}}{2^{\frac{n(n+1)}{2}}}\)
然後地遞推求出 \(2^n\) 的逆元,預處理答案即可。注意超時和超記憶體。

程式碼:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=2e7+5;
ll ans[N],tmp[N],res[N];
ll power(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
void init()
{
    ll tv=power(2LL,mod-2);
    ll inv=1;
    tmp[1]=2;
    for(int i=2;i<=2e7;i++)
        tmp[i]=tmp[i-1]*2%mod;
    ans[0]=1,res[0]=0;
    for(int i=1;i<=2e7;i++)
    {
        inv=inv*tv%mod;
        ans[i]=(ans[i-1]*(tmp[i]-1+mod)%mod*inv)%mod;
    }
    for(int i=1;i<=2e7;i++)
        res[i]=res[i-1]^ans[i];
}
int main()
{
    int t,n;
    scanf("%d",&t);
    init();
    while(t--)
    {
        scanf("%d",&n);
        printf("%lld\n",res[n]);
    }
    return 0;
}