hdu 4549 M斐波那契数列

来源:互联网 发布:吃饭前拍照知乎 编辑:程序博客网 时间:2024/06/06 04:16

M斐波那契数列

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2833    Accepted Submission(s): 849


Problem Description
M斐波那契数列F[n]是一种整数数列,它的定义如下:

F[0] = a
F[1] = b
F[n] = F[n-1] * F[n-2] ( n > 1 )

现在给出a, b, n,你能求出F[n]的值吗?
 

Input
输入包含多组测试数据;
每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 )
 

Output
对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行。
 

Sample Input
0 1 06 10 2
 

Sample Output
060
 

Source
2013金山西山居创意游戏程序挑战赛——初赛(2)
 
这题就是两边取下对数然后构造矩阵就好了,由于是对指数做的操作,所以矩阵快速幂的时候要用下欧拉定理,补下快速幂模板。
#include<stdio.h>#include<algorithm>#include<string>#include<string.h>#include<iostream>using namespace std;#define ll long long#define MOD 1000000007#define F(x,a,b) for (int x=a;x<=b;x++)#define _fast F(i,1,3)F(j,1,3)F(k,1,3) b[i][j]=(b[i][j]+a[i][k]%(MOD-1)*a[k][j]%(MOD-1))%(MOD-1);#define _ffast F(i,1,3)F(j,1,3)F(k,1,3) b[i][j]=(b[i][j]+a[i][k]%(MOD-1)*c[k][j]%(MOD-1))%(MOD-1);#define Orz F(i,1,3)F(j,1,3)c[i][j]=a[i][j];#define reset F(i,1,3)F(j,1,3) {a[i][j]=b[i][j];b[i][j]=0;}#define me(x) memset(x,0,sizeof(x))ll n,a[4][4],b[4][4],c[4][4],aa,bb;void fastmat(ll u){if (u==1||u==0) return;if (u&1){fastmat(u-1);_ffast reset}else{fastmat(u/2);_fast reset}}ll pow(ll a,ll b){if (!b) return 1;if (b&1) {return pow(a,b-1)*a%MOD;}else{ll t=pow(a,b/2)%MOD;return t*t%MOD;}}int main(){      while (cin>>aa>>bb>>n) {me(a);a[1][1]=1;a[1][2]=1;a[2][1]=1;a[3][2]=1;Orz      if (n<2){if (n==0){cout<<aa<<endl;continue;}else{cout<<bb<<endl;continue;}} if (!a||!b){cout<<"0"<<endl;continue;}      fastmat(n-1);      cout<<((pow(aa,a[1][2])%MOD)*(pow(bb,a[1][1])%MOD))%MOD<<endl;}}


0 0
原创粉丝点击