题目描述
大家都知道Fibonacci数列吧,f[1]=1,f[2]=1,f[3]=2,f[4]=3...也就是f[n]=f[n-1]+f[n-2]。现在,问题很简单,输入n和m,求前n项和取模m。
输入
输入n和m
1<=n<=2 000 000 000
1<=m<=1 000 000 010
输出
输出前n项和取模m。
样例输入
5 1000
样例输出
12
题解
这题就是在上一题的基础上多加一个s[i]表示前i项和,公式是这样子的:,改一下代码相应的地方就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
ll n,mod;
struct mat
{
ll x[4][4];
mat()//构造函数初始化数组
{
memset(x,0,sizeof(x));
}
};
mat model;
mat mul(mat a,mat b)
{
mat c;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
{
c.x[i][j]+=a.x[i][k]*b.x[k][j];
c.x[i][j]%=mod;
}
return c;
}
mat mul1(mat a,mat b,int n,int m,int p)
{
mat c;
for(int i=1;i<=n;i++)
for(int j=1;j<=p;j++)
for(int k=1;k<=m;k++)
{
c.x[i][j]+=a.x[i][k]*b.x[k][j];
c.x[i][j]%=mod;
}
return c;
}
mat mi(int n)//快速幂
{
if(n==1)
return model;
mat t=mi(n/2);
if(n%2==1)
return mul(mul(t,t),model);
else
return mul(t,t);
}
int main()
{
cin>>n>>mod;
model.x[1][1]=1,model.x[1][2]=1,model.x[1][3]=0;
model.x[2][1]=0,model.x[2][2]=1,model.x[2][3]=1;
model.x[3][1]=0,model.x[3][2]=1,model.x[3][3]=0;
mat result,start;
start.x[1][1]=1;//,斐波那契的第1、2项都是1,前1项和也是1
start.x[2][1]=1;
start.x[3][1]=1;
result=mul1(mi(n-1),start,3,3,1);//3*3大小的矩阵和3*1大小的矩阵
cout<<result.x[1][1]%mod;
}