SP31428题解

您能不能不要出这么板的题啊.jpg

\(g_n=f_nx^n\),考虑 \(f_nx^n=x\times(f_{n-1}x^{n-1})+x^2\times(f_{n-2}x^{n-2})\)

那么有 \(g_n=x\times g_{n-1}+x^2\times g_{n-2}\),这是一个常系数齐次线性递推。

下面把上面的 \(x\) 叫做 \(a\),能够轻松写出 \(G(x)\) 的 GF 是 \(\frac{x}{1-ax-a^2x^2}\)
题解

做一个前缀和,答案就是 \([x^n]\frac{x}{(1-x)(1-ax-a^2x^2)}=[x^n]\frac{x}{1-(a-1)x-a(a-1)x^2+a^2x^3}\)

拉个 BM 随便算算就行了,复杂度 \(O(3^2\sum\log n)\)

#include<cstdio>
const int mod=1e9+7;
int T;long long n,x;
struct Poly{
	int f[8];
	Poly(){f[0]=f[1]=f[2]=f[3]=f[4]=f[5]=f[6]=f[7]=0;}
	inline int&operator[](const int&x){
		return f[x];
	}
	inline void operator*=(Poly g){
		static Poly ans;for(int i=0;i^8;++i)ans[i]=0;
		for(int i=0;i^4;++i)for(int j=0;j^4;++j)ans[i+j]=(ans[i+j]+1ll*f[i]*g[j])%mod;*this=ans;
	}
};
inline int Solve(long long n,const int&a){
	Poly F,G,H;F[1]=a;G[0]=1;G[1]=(mod-1-a)%mod;G[2]=1ll*(mod+1-a)*a%mod;G[3]=1ll*a*a%mod;
	while(n){
		H[0]=G[0];H[1]=(mod-G[1])%mod;H[2]=G[2];H[3]=(mod-G[3])%mod;F*=H;G*=H;
		F[0]=F[0|n&1];F[1]=F[2|n&1];F[2]=F[4|n&1];F[3]=F[6|n&1];F[4]=F[5]=F[6]=F[7]=0;
		G[0]=G[0];G[1]=G[2];G[2]=G[4];G[3]=G[6];G[4]=G[5]=G[6]=G[7]=0;n>>=1;
	}
	return F[0];
}
signed main(){
	scanf("%d",&T);while(T--)scanf("%lld%lld",&n,&x),printf("%d\n",Solve(n,x%mod));
}
posted @ 2022-07-22 16:57  Prean  阅读(18)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};