题目描述
分析
这题的一个难点是知道线性独立这一概念,并能推出公式。
在此贴出别人的推理
然后使用快速幂和乘法逆元优化即可
注意,进行乘除运算时要算一次模一次
代码
#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]);
}
}