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

题意:

分析:

当时是根据样例猜出的公式:

\[f(n)=\frac{\prod_{n}^{i=1}{(2^i-1)}}{2^{\frac{n(n+1)}{2}}} \]

然后递推求出 \(2^n\) 的逆元,预处理答案即可。注意超时和超内存。
具体的推导过程:https://blog.csdn.net/qq_45458915/article/details/107625864

代码:

#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;
}

posted @ 2020-07-27 19:51  xzx9  阅读(190)  评论(0编辑  收藏  举报