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));
}