problem
analysis
正解矩阵乘法或找规律
斐波那契数列规律是有周期的,每15000次就会变为0,中间的直接暴力了
但是斐波那契数列有求和公式么?能用矩乘求么?
- a1=a2=1,ak=ak−1+ak−2(k∈[3,∞),k∈N)
- 设Sn=∑i=1nai
- Sn=a1+a2+a3+...an=1+a1+a2+a3...+an−1
- ∵a2=1,∴Sn=a2+a1+a2+a3+...+an−1
- ∵a2+a1=a3,∴Sn=a3+a2+a3+...+an−1
- ∴Sn=an+1+an−1=an+2−1
所以直接矩阵快速幂即可,ans即为ay+2−ax+2
code
#include<stdio.h>
#define mod 10000ll
using namespace std;
long long n;
int t;
struct matrix
{
long long m[2][2];
};
matrix A=
{
1,1,
1,0
};
matrix I=
{
1,0,
0,1
};
matrix operator*(matrix a,matrix b)
{
matrix c;
for(int i=0;i<=1;i++)
{
for(int j=0;j<=1;j++)
{
c.m[i][j]=0;
for(int k=0;k<=1;k++)
{
(c.m[i][j]+=a.m[i][k]*b.m[k][j]%mod)%=mod;
}
}
}
return c;
}
matrix power(matrix a,long long k)
{
matrix ans=I,p=a;
while(k)
{
if(k&1)ans=ans*p;
p=p*p;
k/=2;
}
return ans;
}
int main()
{
scanf("%d",&t);
while (t--)
{
long long x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",(power(A,y+1).m[0][0]-power(A,x).m[0][0]+mod)%mod);
}
return 0;
}

本文介绍了一种利用矩阵快速幂方法优化斐波那契数列求和问题的解决方案。通过数学推导得到斐波那契数列求和的通项公式,并给出了具体的C++代码实现。
830

被折叠的 条评论
为什么被折叠?



