题目
https://gmoj.net/senior/#contest/show/3227/2
思路
对初始状态构建势能函数F(S):
假设我们选到a1,a2那么F期望变化量Δ为:
与a无关
那么答案就很显然了:
代码
#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int mod=1e9+7,N=1<<17;
ll power(ll x,ll t)
{
ll b=1;
while(t)
{
if(t&1) b=b*x%mod; x=x*x%mod; t>>=1;
}
return b;
}
int n,s,t,p,aii;
ll inv,ans,sum,_x0[N+77],_x1[N+77];
void init(ll x)
{
aii=N;
_x0[0]=1;
for(int i=1; i<aii; i++) _x0[i]=_x0[i-1]*x%mod;
x=power(x,aii);
_x1[0]=1;
for(int i=1; i<aii; i++) _x1[i]=_x1[i-1]*x%mod;
}
int main()
{
freopen("warfare.in","r",stdin); freopen("warfare.out","w",stdout);
int T;
scanf("%d%d%d%d",&T,&n,&s,&t);
p=(ll)s*power(t,mod-2)%mod;
inv=power(p,mod-2);
init(inv);
if(T==0)
{
for(int i=1; i<=n; i++)
{
ll x;
scanf("%llu",&x);
ll t=x%(mod-1);
sum+=t;
(ans+=_x1[t/aii]*_x0[t%aii]-inv+mod)%=mod;
}
}
else
{
int m;
ll x,y,z,b1,b2;
scanf("%d%llu%llu%llu%llu%llu",&m,&x,&y,&z,&b1,&b2);
int j=1;
while(m--)
{
int q;
scanf("%d",&q);
ll l,r; scanf("%llu%llu",&l,&r);
for(; j<=q; j++)
{
ll t=(b1%(r-l+1)+l)%(mod-1);
sum+=t;
(ans+=_x1[t>>17]*_x0[t&(N)-1]-inv+mod)%=mod;
t=x*b2+y*b1+z;
b1=b2,b2=t;
}
}
}
ll mx=(power(inv,sum)-inv+mod)%mod;
printf("%llu",(mx-ans+mod)*power((2*inv-2+mod)%mod,mod-2)%mod);
}