专栏文章
题解:P12847 [蓝桥杯 2025 国 A] 斐波那契数列
P12847题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mip30afk
- 此快照首次捕获于
- 2025/12/03 05:19 3 个月前
- 此快照最后确认于
- 2025/12/03 05:19 3 个月前
题目大意
求:
的前 项积,其中 。
解题思路
设前 项积为 ,注意到这个 的因子只由若干个 和 相乘组成,我们可以统计这个 的个数和 的个数然后用快速幂实现。在考场上我列出了两个表格来找这个规律。
第一个表格列的是 中因子 的个数和 的个数:
不难看出,无论是因子 的个数还是因子 的个数都组成了一个斐波那契数列。那么求前 项积的过程就转化为了求斐波那契数列的前 项和的过程。这个时候对斐波那契数列比较熟悉的小伙伴已经可以将公式写出来了,本人是个蒟蒻,在考场上没有想到这个结论,于是有了第二张表,即前 项积 所含因子 和因子 的个数:
这里我发现了在因子 的部分又出现了一个斐波那契数列,于是我大胆猜测:斐波那契数列的前 项和也跟斐波那契数列有关。在因子 的部分,其实是在斐波那契数列前加了一个 和一个 (忽略不计)之后得到的数列的前 项和(看第一张表),那么因子 部分得到的即为原斐波那契数列仅加了一个 后得到的前 项和。根据表可以写出: 中因子 的指数为 ,而因子 的指数为 ,即:
赛后我对斐波那契数列的前 项和 进行了数学推导:
由于 ,那么
突然发现:
但是指数会非常大,直接对指数取模怎么才能不对答案产生影响?根据费马小定理:
这里的 就是 , 是个质数,这里可以在求 的时候把答案对 取模以保证答案不变。
矩阵加速时间复杂度为 ( 为矩阵乘法的常数),快速幂的复杂度 ( 为模数),总时间复杂度约为 ,实测跑的飞快。
AC Code
防止作弊不放快读快写。
CPP#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;
}
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...