描述

斐波那契数列大家应该很熟悉了吧。下面给大家引入一种新的斐波那契数列:M斐波那契数列。 M斐波那契数列F[n]是一种整数数列,它的定义如下:

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

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

输入
输入包含多组测试数据;
每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 )
输出
对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行。
样例输入
0 1 0
6 10 2
样例输出
0
60

Solution:

  本题我们容易发现$F[0]=a,F[1]=b,F[2]=ab,F[3]=ab^2,F[4]=a^2b^3,F[5]=a^3b^5…$,设$f[i]表示第i个斐波拉契数$,则$F[n]=a^{f[n-1]}b^{f[n]},n≥2$

  于是,$F[n]=a^{f[n-1]}b^{f[n]}\;mod\;p$,关键是$ a,b $指数会很大,由扩展欧拉定理(关于扩展欧拉定理):

$a^n≡a^{n\;mod\;\phi (p)}\;mod\;p,\quad gcd(a,p)=1$,注意到$ p $为素数,于是$gcd(a,p)=1,\phi (p)=p-1$,

那么本题就直接套上矩阵快速幂取对$p-1$取模求出$a,b$的系数,然后再普通快速幂对$p$取模求$ans$就$OK$了。

代码:

/*题意是给定F[1]=a,F[2]=b,F[n]=F[n-1]*F[n-2],求第n项对素数m取模*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define il inline
#define ll long long
#define mem(p) memset(&p,0,sizeof(p))
using namespace std;
const ll mod = 1e9+;
ll a,b,n,phi=mod-,mia,mib;
struct mat{ll a[][],r,c;};
il mat mul(mat x,mat y)
{
mat p;
mem(p);
p.r=x.r,p.c=y.c;
for(int i=;i<x.r;i++)
for(int j=;j<y.c;j++)
for(int k=;k<x.c;k++)
p.a[i][j]=(p.a[i][j]+x.a[i][k]*y.a[k][j]%phi)%phi;
return p;
}
il void fast(ll k)
{
mat p,ans;
mem(p),mem(ans);
p.r=p.c=;
p.a[][]=p.a[][]=p.a[][]=;
ans.r=,ans.c=;
ans.a[][]=,ans.a[][]=;
while(k){
if(k&)ans=mul(ans,p);
p=mul(p,p);
k>>=;
}
mib=ans.a[][];mia=ans.a[][];
}
il ll qpow(ll o,ll k)
{
ll ans=;
while(k)
{
if(k&)ans=ans*o%mod;
k>>=;
o=o*o%mod;
}
return ans;
}
int main()
{
ios::sync_with_stdio();
//cout<<phi<<endl;
while(cin>>a>>b>>n){
if(n==){cout<<(a>mod?a%mod:a)<<endl;continue;}
if(n==){cout<<(b>mod?b%mod:b)<<endl;continue;}
if(n==){cout<<a*b%mod<<endl;continue;}
fast(n-);
// cout<<mia<<' '<<mib<<endl;
cout<<qpow(a,mia)*qpow(b,mib)%mod<<endl;
}
return ;
}

最新文章

  1. Codeforces Round #333 (Div. 1) D. Acyclic Organic Compounds trie树合并
  2. 配置Qt开发环境下的OpenCV开发
  3. [Falcor] Return the data from server
  4. 该如何关闭thinkphp的缓存呢?有下面几种方法可参考:
  5. RH253读书笔记(4)-Lab 4 The Domain Name System
  6. [原]MobileSubstrate 工作流程
  7. 在centos6编译安装http-2.4
  8. 安装redis 2.6.4
  9. SharpMap在web上的应用
  10. asp.net core 的 razor pages 如何使用ajax调用后台方法
  11. Sqlserver 2008R2设置数据库只对特定用户可见
  12. MySQL高可用之组复制(1):组复制技术简介
  13. MysqL_select for update锁详解
  14. Apache Beam: 下一代的大数据处理标准
  15. jQuery中click事件多次触发解决方案
  16. Android属性allowBackup安全风险浅析
  17. JDK动态代理[3]----WeakCache缓存的实现机制
  18. linux上安装BeatifulSoup(第三方python库)
  19. Oracle 安全性一
  20. Linux 文件系统目录结构

热门文章

  1. [Jmeter并发报错解决方案]org.apache.http.NoHttpResponseException: 10.0.4.147:8000 failed to respond
  2. Javascript闭包例子
  3. JS日期转换
  4. Mac安装php和redis扩展
  5. Question | 你所遇到的验证码问题可能都在这里了
  6. 如何设置虚拟化的centos内、外网络通畅
  7. Navicat 导入sql脚本文件
  8. katalon系列三:Project Setting-项目设置
  9. bash特性-命令历史命令行编辑
  10. JAVA基础学习之路(四)定义简单java类