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);
	}
}
posted @ 2021-02-25 15:24  celerity1  阅读(98)  评论(0)    收藏  举报