总而言之,就是求 即斐波那契数列。
开始,我们先要知道gcd和fibonacci数列之间不可描述的关系:
接着,我们看看原题给的式子,有a,b,c,d四个参数,考虑最基本的消参思路,将其转化为:
①
由性质2与性质4,我们可以发现,我们利用辗转相除法,变为
这样逐步消下去,就会变成①式的形式。
接着考虑对①式的转化:
设,那么答案即为
因为
所以
所以由性质3,答案即为
同时我们还可以用矩阵乘法求
#include<bits/stdc++.h>
using namespace std;
#define in inline
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define repd(i,a,b) for(int i=a;i>=b;i--)
#define For(i,a,b) for(int i=a;i<b;i++)
#define _(d) while(d(isdigit(ch=getchar())))
template<class T>in void g(T&t){T x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch-48;_()x=x*10+ch-48;t=f*x;}
typedef long long ll;
const ll MOD=998244353;
ll mod;
struct matrix{
ll a[5][5];
in void init(){a[1][1]=1,a[1][2]=0,a[2][1]=0,a[2][2]=1;}
in void Clear(){memset(a,0,sizeof(a));}
in void unit(){a[1][1]=1,a[1][2]=1,a[2][1]=1,a[2][2]=0;}
in matrix operator*(const matrix tt)const{
matrix c;c.Clear();
rep(i,1,2) rep(j,1,2) rep(k,1,2)
c.a[i][j]=(c.a[i][j]+a[i][k]*tt.a[k][j]+mod)%mod;
return c;
}
in matrix operator^(ll y){
matrix tmp,c=*this;tmp.init();
while(y){
if(y&1) tmp=tmp*c;
c=c*c;y>>=1;
}return tmp;
}
}e;
ll n,a,b,c,d;
in ll F(ll x,ll M){
mod=M;
matrix tmp=e^(x);
return tmp.a[1][2]%mod;
}
int main(){
//freopen(".in","r",stdin);freopen(".out","w",stdout);
int T;g(T);e.unit();
while(T--){
g(n),g(a),g(b),g(c),g(d);
while(c){
b-=(a/c)*d;a%=c;
if(a<c) swap(a,c),swap(b,d);
}
if(!a){
ll ans=F(n+1,MOD)*__gcd(b,d);
printf("%lld\n",(ans%MOD+MOD)%MOD);
}
else if(!d){
ll ans=F(n,MOD)*a%MOD+F(n+1,MOD)*b%MOD;
printf("%lld\n",(ans%MOD+MOD)%MOD);
}
else{
ll h=__gcd(F(n+1,a),a);
ll ans=__gcd(a*F(n,h*d)+b*F(n+1,h*d),h*d);
printf("%lld\n",abs(ans)%MOD);
}
}
return 0;
}
若有错误请指正谢谢