JADUGAR2和GDKOI东方永夜抄
考虑\(f\)的ogf\(F(x)=\sum_{i=1}^{\inf} x^if_i\)
则\(F(x)[x^n]=AF(x)[x^{n-1}]+BF(x)^2[x^{n-1}]\)
\(F(x)=AF(x)x+BF(x)^2x+kx\)
\(F(x)=\frac{1-Ax\pm\sqrt{(1-Ax)^2-4kBx}}{2B}\)
由于\(F(x)\)常数项为\(0\),sqrt处常数项为\(1\)
发现我们只需要考虑\(\sqrt{(1-Ax)^2-4kBx}\),其他可以直接计算。
令\(G(x)=\sqrt{(1-Ax)^2-4kBx},G(x)[x^i]=g_i\)
要解出\(F\),设\(H(x)=G(x)^2\),则\(H(x)^{\frac{1}{2}}=G(x)\)
\(G'(x)=\frac{1}{2}H^{-\frac{1}{2}}(x)H'(x)\)
有一个除法不好做,\(G'(x)H(x)=\frac{1}{2}H^{\frac{1}{2}}(x)H'(x)\)
\([x^n]G'(x)H(x)=[x^n]\frac{1}{2}G(x)H'(x)\)
\(F'(x)=\sum_{i=0}^{\infty}f_{i+1}(i+1)x^i\)
发现\(H(x)\)是个项数为\(3\)的多项式,这样子就方便计算了。
枚举\(H(x)\)取哪一项,得到\(g_i=\frac{-(2A+4kB)(\frac{3}{2}-i)g_{i-1}+A^2(3-i)g_{i-2}}{i}\)
这样子就可以得到\(f\)。
询问直接前缀和即可。
时间复杂度\(O(\max R)\)
#include<bits/stdc++.h>
using namespace std;
#define N 10000010
#define int long long
#define mo 1000000007
int n,k,a,b,q,iv[N],f[N],s[N];
signed main(){
scanf("%lld%lld%lld%lld%lld",&n,&k,&a,&b,&q);
iv[0]=iv[1]=1;
for(int i=2;i<N;i++)
iv[i]=(mo-mo/i*iv[mo%i]%mo+mo)%mo;
int p2=3*iv[2]%mo;
f[1]=k;
f[2]=(a+b*k%mo)%mo*k%mo;
for(int i=3;i<N;i++){
f[i]=((2*i-3+mo)*(a+2*k%mo*b%mo)%mo*f[i-1]%mo-f[i-2]*(i-3)%mo*a%mo*a%mo+mo)*iv[i]%mo;
}
for(int i=1;i<=n;i++)
s[i]=(s[i-1]+f[i]*f[i]%mo)%mo;
while(q--){
int l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",(s[r]-s[l-1]+mo)%mo);
}
}