博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nyoj1000_快速幂_费马小定理
阅读量:5114 次
发布时间:2019-06-13

本文共 2601 字,大约阅读时间需要 8 分钟。

又见斐波那契数列

时间限制:
1000 ms  |  内存限制:65535 KB
难度:
4
 
描述

斐波那契数列大家应该很熟悉了吧。下面给大家引入一种新的斐波那契数列: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
上传者
解题思路:这个题需要用到费马小定理,要先知道什么叫做费马小定理。
  实际上就是这么一个式子 a^(p-1)≡1 (mod p), 意思是在取模的情况下这两边是相等的(p是质数时)。
     当p为质数时可以这么用,(a^b) %p=a^(b%(p-1))。
     但为什么这么用呢?
  
  
  b是一个质数的时候,可以分解成k(p-1)+c (c是b%(p-1)的余数)。
  。。。
   另外本题先通过找规律得到这个:

          f(0)=a        (1,0)

                          f(1)=b;       (0,1)

                          f(2)=ab      (1,1)

                          f(3)=abb     (1,2)

                          f(4)=abbab   (2,3)

                          f(5)=abbababb    (3,5)

                          f(6)=abbababbabbab  (5,8)

所以F(n)=  [a^f(n-1) * b^f(n)] %mod   =   a^[f(n-1)%mod-1] * b^[f(n)%mod-1]  %mod;

f(n)是一个标准的斐波那契数列,用矩阵快速幂求出来之后然后分别通过快速幂求a的幂,b的幂,然后可得出结果。

#include 
#include
#include
#define MOD 1000000006#define MOD2 1000000007using namespace std;struct matrix{ long long int m[2][2];};matrix base,ans;void init(){
//只初始化base和ans(单位矩阵) memset(base.m,0,sizeof(base.m)); memset(ans.m,0,sizeof(ans.m)); for(int i=0;i<2;i++){ ans.m[i][i]=1; } base.m[0][0]=base.m[0][1]=base.m[1][0]=1;}matrix multi(matrix a,matrix b){ matrix t; for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ t.m[i][j]=0; for(int k=0;k<2;k++){ t.m[i][j]=(t.m[i][j]+(a.m[i][k]%MOD)*(b.m[k][j]))%MOD; } } } return t;}long int fast_matrix(int n){ while(n){ if(n&1){ ans=multi(ans,base); } base=multi(base,base); n>>=1; } return ans.m[1][0];}long long int fast_power(long long int a,long long int n){ long long int ans=1,p=a; while(n){ if(n&1){ ans=((ans%MOD2)*(p%MOD2))%MOD2; } n>>=1; p=((p%MOD2)*(p%MOD2))%MOD2; } return ans;}int main(){ long long int a,b,n; while(~scanf("%lld %lld %lld",&a,&b,&n)){ if(n==0){ printf("%lld\n",a%MOD2); continue; } if(n==1){ printf("%lld\n",b%MOD2); continue; } if(n==2){ printf("%lld\n",a*b%MOD2); continue; } init(); long long int f=fast_matrix(n);//fib(n) long long int f2=ans.m[1][1];//fib(n-1) long long int m1=fast_power(a,f2); long long int m2=fast_power(b,f); long long int ans=m1*m2%MOD2; printf("%lld\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/TWS-YIFEI/p/5947223.html

你可能感兴趣的文章
Ansible playbook
查看>>
写了个散列算法... 用来获取字符串的哈希. 超高效.10亿以下几乎无碰撞.
查看>>
三极晶体管放大电路实验
查看>>
UnrealEngine4和3DMax的配合_准备资源
查看>>
(初学者)初学者的编程的苦恼
查看>>
DataTable 去重合并
查看>>
剑指Offer_27_字符串的排列
查看>>
12-文本属性和字体属性
查看>>
Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能[转]
查看>>
混淆Android JAR包的方法
查看>>
今天实现了一个功能就是,树结点的拖动
查看>>
自动补全插件之二
查看>>
docker 安装 FastDFS
查看>>
Android 样式
查看>>
Oracle DBHelper
查看>>
啊金学习javascript系列一之javascript整体印象
查看>>
[Go] Returning Multiple Values from a Function in Go
查看>>
[Polymer] Introduction
查看>>
Zabbix实战-简易教程--拓扑图(Maps)
查看>>
开启html元素的编辑模式contenteditable="true"
查看>>