nyoj1000_快速幂_费马小定理
又见斐波那契数列
- 描述
-
斐波那契数列大家应该很熟悉了吧。下面给大家引入一种新的斐波那契数列: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 - 上传者
- TC_李远航
- 解题思路:这个题需要用到费马小定理,要先知道什么叫做费马小定理。
- 实际上就是这么一个式子 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 <iostream>
#include <cstdio>
#include <cstring>
#define MOD 1000000006
#define MOD2 1000000007
using namespace std; struct matrix{
long long int m[][];
}; matrix base,ans; void init(){//只初始化base和ans(单位矩阵)
memset(base.m,,sizeof(base.m));
memset(ans.m,,sizeof(ans.m));
for(int i=;i<;i++){
ans.m[i][i]=;
} base.m[][]=base.m[][]=base.m[][]=;
} matrix multi(matrix a,matrix b){
matrix t;
for(int i=;i<;i++){
for(int j=;j<;j++){
t.m[i][j]=;
for(int k=;k<;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&){
ans=multi(ans,base);
}
base=multi(base,base);
n>>=;
}
return ans.m[][];
} long long int fast_power(long long int a,long long int n){
long long int ans=,p=a;
while(n){
if(n&){
ans=((ans%MOD2)*(p%MOD2))%MOD2;
}
n>>=;
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==){
printf("%lld\n",a%MOD2);
continue;
}
if(n==){
printf("%lld\n",b%MOD2);
continue;
}
if(n==){
printf("%lld\n",a*b%MOD2);
continue;
} init();
long long int f=fast_matrix(n);//fib(n)
long long int f2=ans.m[][];//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 ;
}
nyoj1000_快速幂_费马小定理的更多相关文章
- [HDOJ5667]Sequence(矩阵快速幂,费马小定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5667 费马小定理: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p). 即 ...
- hdu_4869(费马小定理+快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4869 Turn the pokers Time Limit: 2000/1000 MS (Java/O ...
- hdu 4704 Sum (整数和分解+快速幂+费马小定理降幂)
题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7).其中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3. ...
- poj 3734 Blocks 快速幂+费马小定理+组合数学
题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...
- 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum
Sum Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=4704 Mean: 给定一个大整数N,求1到N中每个数的因式分解个数的 ...
- HDU 5793 A Boring Question (逆元+快速幂+费马小定理) ---2016杭电多校联合第六场
A Boring Question Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)
题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...
- BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的 ...
- hdu4549(费马小定理 + 快速幂)
M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n ...
随机推荐
- scp命令的用法详解
这篇文章主要是参考了http://blog.csdn.net/jiangkai_nju/article/details/7338177这个博客,要看详细的内容可以参考这个博客进行学习研究,但是我觉得在 ...
- webpack 前端构建
一.建立简单的项目目录 1.创建 manager 根目录(作为项目根目录)2.执行 npm init,在根目录manager下自动生成 package.json文件3.npm install webp ...
- getStyle(),修改样式属性
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Reading Famous blog to prevent me wasting time on blind wandering
I can`t help surfing the useless bbs and some other kind of SNS. The time I begin to do it, it costs ...
- express 框架之 路由与中间件
1. 什么是router路径,什么是middleware? 我们输入www.baidu.com 来访问百度的主页,浏览器会自动转换为 http://www.baidu.com:80/(省略一些参数) ...
- 必须知道的.net(继承)
1.继承定义:就是面向对象中类与类之间的一种关系.通过继承,使得子类具有父类的属性和方法,同时子类也可以通过加入新的属性和方法或者修改父类的属性和方法建立新的类层次. 2.CLR支持实现单继承和接口多 ...
- UI第三节—— UITextField详解
戏言:UITextField对于需要登陆注册的界面的作用还是相当明显,但是对于键盘过的遮挡问题,可是重点哦!这里就涉及到通知(NSNotificationCenter)的内容. //注册事件 [[NS ...
- Javascript高级程序设计——面向对象之实现继承
原型链: 构造函数中都有一个prototype属性指针,这个指针指向原型对象,而创建的实例也有指向这个原型对象的指针__proto__.当实例查找方法时先在实例上找,找不到再通过__proto__到原 ...
- HLOI2016滚粗记
首先,别问我HLOI是哪里....HLJ = 黑龙江... 这次的省选总结起来还是由于我太弱,考试的时候状态不好,连个线段树都没想出来 坐了好久的火车到哈尔滨,车上打了一会扑克,感觉没过多长时间就到了 ...
- Divide Two Integers
视频讲解 http://v.youku.com/v_show/id_XMTY1MTAyODM3Ng==.html int 范围: Integer.MIN_VALUE => -214748364 ...