2020牛客暑期多校训练营(第六场)Binary Vector

题目描述

在这里插入图片描述

分析

这题的一个难点是知道线性独立这一概念,并能推出公式。
在此贴出别人的推理
在这里插入图片描述
然后使用快速幂和乘法逆元优化即可
注意,进行乘除运算时要算一次模一次
代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAXN=2e7,mod=1e9+7;
ll T,n,base[MAXN],inv[MAXN],ans[MAXN],i,x;
ll ksm(ll x,ll p)
{
    ll ret=1;
    while(p)
    {
        if(p&1) ret=ret*x%mod;
        x=x*x%mod;
        p>>=1;
    }
    return ret;
}
int main()
{
	base[0]=1;
    for(i=1;i<=MAXN;i++)
	 base[i]=2ll*base[i-1]%mod;
    inv[MAXN]=ksm(base[MAXN],mod-2);
    for(i=MAXN-1;i;i--)
	 inv[i]=2ll*inv[i+1]%mod;
    x=inv[1];
    ans[1]=inv[1];
    for(i=2;i<=MAXN;i++)
    {
		x=((x*(base[i]-1)%mod)*inv[i])%mod;
		ans[i]=ans[i-1]^x;   	
    }
	for(scanf("%d",&T);T--;)
	{
		scanf("%d",&n);
		printf("%d\n",ans[n]);		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_46070004/article/details/107669411