您的位置:首页 > 其它

[P1962]斐波那契数列

2017-03-31 14:29 183 查看
原题链接

一接过题来

不就是斐波那契数列吗

入门级

但是哦

数据范围是

int64

所以

只能用一个新的东西啦

矩阵快速幂

构建一个矩阵A

使矩阵f
,f[n-1]*A=f[n+1],f

那么我们只需要使f[2],f[1]*A^n-2

就能得到我们的f

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define mod 1000000007
using namespace std;

long long A1[3][3]=
{
0,0,0,
0,1,1,
0,1,0,
};

long long n,x,num[3]={0,1,1},bak[3][3],i,j,p,ans,mid[3];

void powA()
{
while(x>1)
{
p=x%2;
x=x/2;

if(p==1)
{
mid[1]=((num[1]*A1[1][1])%mod+(num[2]*A1[2][1])%mod)%mod;
mid[2]=((num[1]*A1[1][2])%mod+(num[2]*A1[2][2])%mod)%mod;

num[1]=mid[1];
num[2]=mid[2];
}

for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
bak[i][j]=((A1[i][1]*A1[1][j])%mod+(A1[i][2]*A1[2][j])%mod)%mod;

for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
A1[i][j]=bak[i][j];
}
}

int main()
{
scanf("%lld",&n);

if(n<=2)
{
printf("%lld",num
);
return 0;
}

x=n-2;

powA();

ans=((num[1]*A1[1][1])%mod+(num[2]*A1[2][1])%mod)%mod;

printf("%lld",ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: