题解:P12847 [蓝桥杯 2025 国 A] 斐波那契数列
题目大意
求:
的前
解题思路
设前
第一个表格列的是
不难看出,无论是因子
这里我发现了在因子
赛后我对斐波那契数列的前
由于
突然发现:
1\le n\le 10^{18}
这个数据范围想要
但是指数会非常大,直接对指数取模怎么才能不对答案产生影响?根据费马小定理:
这里的
矩阵加速时间复杂度为
AC Code
防止作弊不放快读快写。
#define int long long
#define mod 998244353
using namespace std;
struct matrix
{
int num[3][3];
}e,a;//转移矩阵,原矩阵
matrix operator*(const matrix &a,const matrix &b)
{
matrix ans={};
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
ans.num[i][j]+=a.num[i][k]*b.num[k][j],ans.num[i][j]%=(mod-1);//注意这里取模是 mod-1
return ans;
}
matrix jzksm(matrix a,int b)//矩阵快速幂
{
matrix ans={};
ans.num[1][1]=ans.num[2][2]=1;
for(;b;b>>=1,a=a*a)
if(b&1)
ans=ans*a;
return ans;
}
int ksm(int a,int b)//快速幂
{
int ans=1;
for(;b;b>>=1,a*=a,a%=mod)
if(b&1)
ans*=a,ans%=mod;
return ans;
}
signed main()
{
int n=re();
a.num[1][1]=a.num[1][2]=1;
e.num[1][2]=e.num[2][1]=e.num[2][2]=1;
matrix ans=a*jzksm(e,n-1);
int anss=ksm(2,ans.num[1][1])*ksm(3,ans.num[1][2]-1)%mod;
wr(anss);
return 0;
}