• 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-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);
    	}
    }
    
  • 相关阅读:
    qq
    构造方法
    Java模块化开发
    q
    qqq
    qq
    qqq
    Git服务器搭建及SSH无密码登录设置
    php面向对象中的魔术方法中文说明
    计算机中丢失 msvcr110.dll 怎么办
  • 原文地址:https://www.cnblogs.com/ctmlpfs/p/14447166.html
Copyright © 2020-2023  润新知