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;
}