考虑(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-Axpmsqrt{(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
",(s[r]-s[l-1]+mo)%mo);
}
}