结论破题,浪费了我三张纸,结论居然只和斐波那契数列有关,有趣
推导过程太多不写了qwq,虽然推导很简单,但是有个坑点,很难想到将 $ S_i $ 最终化为 $ F_i $ 表示。
结论是 \[ S_i = F_{n*2} \]
所以这道题我们只需要求斐波那契数就行了,是不是很简单啊qwq。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 5;
ll Mod;
struct matrix{
ll M[N][N];
int l,r;
void operator * (matrix x){
int i,j,k; matrix t;
for(i=1;i<=l;i++)
for(j=1;j<=r;j++)
t.M[i][j]=0;
for(i=1;i<=r;i++)
for(j=1;j<=x.l;j++)
for(k=1;k<=l;k++)
t.M[j][i] = (t.M[j][i] + M[k][i] * x.M[j][k]) % Mod;
for(i=1;i<=l;i++)
for(j=1;j<=r;j++)
M[i][j]=t.M[i][j];
}
}res,a,c,ans;
int main(){
int i,j,T,cnt;ll n;
res.l=2; res.r=1;
a.l=a.r=2;
a.M[1][1]=a.M[1][2]=a.M[2][1]=1; a.M[2][2]=0;
res.M[1][1]=1; res.M[1][2]=0;
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&n,&Mod);
if(n==0){
printf("0\n");
continue;
}
ans=res;
c=a;
n*=2; n-=1;
for(; n ; n >>= 1){
if(n & 1) ans * c;
c * c;
}
printf("%lld\n",ans.M[1][1]);
}
return 0;
}
时间: 2024-10-06 16:41:29