M斐波那契数列

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

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 0
6 10 2
 
Sample Output
0
60

分析:F[2]=F[1]*F[0],F[3]=F[2]*F[1]=F[1]^2*F[0],F[4]=F[1]^3*F[0]^2...==>F[n]=F[1]^f(n-1) * F[0]^f(n-2);//f(n)表示第n个斐波那契数

所以只要求a^f(n-2) * b^f(n-1),但是f(n)将非常大(超过64位),这时候就要知道有个费马小定理了:(a^b)%mod =a^( b%(mod-1) )%mod

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<vector>
#include<iomanip>
#define INF 99999999
using namespace std; const int MAX=10;
const int mod=1000000007;
__int64 sum[2][2],array[2][2]; void MatrixMult(__int64 a[2][2],__int64 b[2][2]){
__int64 c[2][2];
c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0];
c[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1];
c[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0];
c[1][1]=a[1][0]*b[0][1]+a[1][1]*b[1][1];
for(int i=0;i<2;++i){
for(int j=0;j<2;++j)a[i][j]=c[i][j]%(mod-1);
}
} int Matrix(int k){
array[0][0]=0;
array[0][1]=array[1][0]=array[1][1]=1;
while(k){
if(k&1)MatrixMult(sum,array);
MatrixMult(array,array);
k>>=1;
}
return (sum[0][0]+sum[0][1])%(mod-1);
} __int64 FastPower(__int64 a,int k){
__int64 ans=1;
while(k){
if(k&1)ans=(ans*a)%mod;
a=(a*a)%mod;
k>>=1;
}
return ans;
} int main(){
__int64 a,b,n;
while(cin>>a>>b>>n){
if(n<2){printf("%I64d\n",n?b:a);continue;}
sum[0][0]=sum[1][1]=1;
sum[0][1]=sum[1][0]=0;
int i=Matrix(n-2);
int j=Matrix(1);
printf("%I64d\n",(FastPower(a,i)*FastPower(b,j))%mod);
}
return 0;
}

最新文章

  1. iOS中多线程知识总结(二)
  2. WPF实现炫酷Loading控件
  3. Linux Philosophy
  4. 我也来SplashScreen
  5. apache2服务器mod_rewrite模块 开启方法[linux, ubuntu]
  6. LINQ to SQL更新数据库操作(转载)
  7. 【leetcode】Add Two Numbers(middle) ☆
  8. 【JS】Beginner9:Arrays
  9. 织梦DedeCms用SQL语句调用数据库任意内容
  10. Microsoft Anti-Cross Site Scripting Library V4.2 下载地址
  11. mySQL使用实践
  12. JVM 学习(二)Java 内存模型、方法内联、逃逸 --- 2019年4月
  13. Vue组件的is具体用法
  14. PostgreSQL查看表、表索引、视图、表结构
  15. Linux内核的整体架构简介
  16. vim编辑器第二天
  17. GAN (Generative Adversarial Network)
  18. 【题解】Luogu P1533 可怜的狗狗
  19. logback-spring.xml配置示例
  20. OpenGl 中的基本数据类型

热门文章

  1. 使用OC开发phonegp 组件
  2. 使用Eclipse搭建C/C++开发环境(转)
  3. SGU 125.Shtirlits
  4. SGU 207.Robbers
  5. 【POJ3243】【拓展BSGS】Clever Y
  6. 【POJ2985】【Treap + 并查集】The k-th Largest Group
  7. WPF自定义DataGrid分页控件
  8. prototype/constructor/__proto__之constructor。
  9. JQUERY1.9学习笔记 之属性选择器(一) 前缀选择器
  10. mysql数据类型——字符串char(m)和varchar(m)