zcmu-1184 幫我求算一下斐波那契數吧
1184: 幫我求算一下斐波那契數吧
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 239 Solved: 49
[Submit][Status][Web Board]
Description
AYY小朋友對斐波那契數非常感興趣,他知道f[1]=1,f[2]=1,並且從第三個斐波那契數開始f[n]=f[n-2]+f[n-1](n>=3),可是AYY小朋友只會計算前十個斐波那契數,因此他向你請教,讓你幫忙計算第N個斐波那契數是多少,但是由於結果非常大,只需告訴他對1000000007取模的結果。
Input
多組測試資料
每行一個n(1<=n<=2^32-1)
Output
輸出第n個斐波那契數的結果(對1000000007取模)
Sample Input
1
10
100
1000
10000
Sample Output
1
55
687995182
517691607
271496360
HINT
//直接算超時,用矩陣快速冪
1,1 f2,0 f3,0
1,0 * f1,0 = f2,0
Source
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const ll p=1000000007;
struct mat
{
ll a[2][2];
};
mat mul(mat x,mat y)
{
mat ans;
memset(ans.a,0,sizeof(ans.a));
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
for(int k=0;k<2;k++)
{
ans.a[i][j]=((ans.a[i][j]+((x.a[i][k]%p)*y.a[k][j])%p))%p;
}
}
}
return ans;
}
ll fastpowerMod(ll n)
{
mat s;
memset(s.a,0,sizeof(s.a));
for(int i=0;i<2;i++)s.a[i][i]=1;
mat res;
memset(res.a,0,sizeof(res.a));
res.a[0][0]=1;
res.a[0][1]=1;
res.a[1][0]=1;
res.a[1][1]=0;
while(n!=0)
{
if(n%2==1)
s=mul(s,res);
res=mul(res,res);
n=n>>1;
}
mat result;
result.a[0][0]=1;
result.a[1][0]=1;
result.a[0][1]=result.a[1][1]=0;
result=mul(s,result);
return result.a[0][0];
}
int main()
{
ll n;
while(~scanf("%lld",&n))
{
if(n<=2)
printf("1\n");
else
printf("%lld\n",fastpowerMod(n-2));
}
return 0;
}
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll mod=1000000007;
struct mat
{
ll a[2][2];
};
mat mul(mat x,mat y)
{
mat xy;
memset(xy.a,0,sizeof(xy.a));
int i,j,k;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
for(k=0;k<2;k++)
{
xy.a[i][j]=(xy.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
}
}
}
return xy;
}
void fastpowerMod(ll n)
{
mat s,res;
memset(s.a,0,sizeof(s.a));
for(ll i=0;i<2;i++)s.a[i][i]=1;
res.a[0][0]=res.a[0][1]=res.a[1][0]=1;
res.a[1][1]=0;
while(n)
{
if(n%2==1)
s=mul(s,res);
res=mul(res,res);
n=n>>1;
}
printf("%lld\n",s.a[0][1]);
}
int main()
{
ll n;
while(~scanf("%lld",&n))
{
fastpowerMod(n);
}
return 0;
}
相關文章
- 斐波那契數
- 斐波那契數列
- fibonacci斐波那契數列詳解 遞迴求Fn非遞迴求Fn求n最近的斐波那契數遞迴
- LeetCode 509[斐波那契數]LeetCode
- 斐波那契數列(Java)Java
- Leedcode-斐波那契數
- 509. 斐波那契數
- 一千位斐波那契數
- 求斐波那契數,你還在用遞迴嗎?遞迴
- LeetCode-509-斐波那契數LeetCode
- 斐波那契數列詳解
- 著名的斐波那契數列
- 斐波那契數列 (C#)C#
- PHP 與斐波那契數列PHP
- 計算斐波那契數列的演算法演算法
- LeetCode LCR126[斐波那契數]LeetCode
- [C103] 斐波那契數列
- 力扣之斐波那契數列力扣
- 斐波那契數列js 實現JS
- 劍指offer——斐波那契數列
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- js實現斐波那契數列JS
- 斐波那契數列演算法演算法
- 第十題:斐波那契數列
- 每日一算 -- 斐波那契數列型別題型別
- 斐波那契數列的來源——數兔子
- 斐波那契數列數與等冪和
- LeetCode 1137第N個斐波那契數LeetCode
- 【LeetCode刷題】509. 斐波那契數LeetCode
- 使用Python實現斐波那契數列Python
- 演算法(1)斐波那契數列演算法
- №20181213賽事:斐波那契數賽題
- Java語言非遞迴求第n個斐波那契數Java遞迴
- 大數斐波那契數列的演算法演算法
- №20201020斐波那契7數賽果確認
- JavaScript 實現:輸出斐波那契數列JavaScript
- js迭代器實現斐波那契數列JS
- LeetCode每日一題:斐波那契數(No.509)LeetCode每日一題