hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)

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

从网上找了3段为什么是1e9+6的解释:

A^B %C 这题的C是质素,而且A,C是互质的。
所以直接A^(B%(C-1)) %C

比较一般的结论是 A^B %C=A^( B%phi(C)+phi(C) ) %C B>=phi(C)

求a^fib(n)%mod,mod=10^9+7,由于mod是一个大质数,根据费马小定理,a^(mod-1)=1(mod m),所以a^x有一个循环节,这个循环节为10^9+6

模数之所以为1000000006是因为根据费马小定理可得A^euler(M) = 1 (mod M),其中M为素数。 所以A^N = A^(N % euler(M))(mod M),而1000000007为素数,euler(1000000007)= 1000000006,所以模数是1000000006。

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <algorithm>
 4 # include <map>
 5 # include <cmath>
 6 # define LL long long
 7 using namespace std ;
 8
 9 const int MOD = 1000000007 ;
10
11 struct Matrix
12 {
13     LL mat[2][2];
14 };
15
16 Matrix mul(Matrix a,Matrix b) //矩阵乘法
17 {
18     Matrix c;
19     for(int i=0;i<2;i++)
20         for(int j=0;j<2;j++)
21         {
22             c.mat[i][j]=0;
23             for(int k=0;k<2;k++)
24             {
25                 c.mat[i][j]=(c.mat[i][j] + a.mat[i][k]*b.mat[k][j])%(MOD-1);  //费马小定理
26             }
27         }
28     return c;
29 }
30 Matrix pow_M(Matrix a,int k)  //矩阵快速幂
31 {
32     Matrix ans;
33     memset(ans.mat,0,sizeof(ans.mat));
34     for (int i=0;i<2;i++)
35         ans.mat[i][i]=1;
36     Matrix temp=a;
37     while(k)
38     {
39         if(k&1)ans=mul(ans,temp);
40         temp=mul(temp,temp);
41         k>>=1;
42     }
43     return ans;
44 }
45
46 LL pow_m(LL p, LL k)
47 {
48
49     LL ans = 1;
50     while(k) {
51         if (k & 1) ans = ans * p % MOD;
52         p = (LL)p*p % MOD;
53         k >>= 1;
54     }
55     return ans;
56 }
57
58 int main ()
59 {
60    // freopen("in.txt","r",stdin) ;
61     int a,b,n;
62     Matrix t ;
63     t.mat[0][0] = 0 ;
64     t.mat[0][1] = t.mat[1][0] = t.mat[1][1] = 1 ;
65     while(scanf("%d%d%d",&a,&b,&n)!=EOF)
66     {
67         Matrix p=pow_M(t,n);
68         int ans=(pow_m(a,p.mat[0][0])*pow_m(b,p.mat[1][0]))%MOD;
69         printf("%d\n",ans);
70     }
71
72
73     return 0 ;
74 }

时间: 2024-08-07 17:00:39

hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)的相关文章

HDU 4549 M斐波那契数列 ( 矩阵快速幂 + 费马小定理 )

HDU 4549 M斐波那契数列 (  矩阵快速幂 + 费马小定理  ) 题意:中文题,不解释 分析:最好的分析就是先推一推前几项,看看有什么规律 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef __int64 LL; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 100000

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊.然而我就是那大坑,哈哈. 不说了,直接说题吧,先讨论k=1,2,3;时的解.这应该会解吧,不多说了: 从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]

M斐波那契数列(矩阵快速幂+费马小定理)

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1672    Accepted Submission(s): 482 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a,

HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)

Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[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取模后的值即可

hdu 4549 (矩阵快速幂+费马小定理)

题意:已知F0=a,F1=b,Fn=Fn-1*Fn-2,给你a,b,n求Fn%1000000007的值 思路:我们试着写几组数 F0=a F1=b F2=a*b F3=a*b2 F4=a2*b3 F5=a3*b5 我们发现a,b的系数其实是斐波那契数列,我们只需用矩阵快速幂求出相应系数就行,但是 这个系数随着增长会特别大,这时我们需要利用费马小定理进行降幂处理 费马小定理 ap-1≡1(mod p) 代码: #include <iostream> #include <cmath>

CSU1516矩阵快速幂+费马小定理

通过这个题真的学到了不少东西,最起码矩阵快速幂算是入门了,普通快速幂也彻底明白了(以前都是打模板),了解了费马小定理 关键点 求(a^fib[b])%p 的值其中p是素数,0<a<p, b在int范围内 先假设fib[b]>p-1 那么上式 (a^fib[b])%p = (a^(p-1)*a^(p-1)*....*a^(p-1)*a^m)%p (这里 m = fib[b]%(p-1)) 由于p是素数且a<p那么gcd(a,p)=1,所以由费小可得(a^(p-1))%p=1 那上式就

hdu4549矩阵快速幂+费马小定理

转移矩阵很容易求就是|0  1|,第一项是|0| |1  1|             |1| 然后直接矩阵快速幂,要用到费马小定理 :假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p).即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1(这东西贡献了我8次wa) 对矩阵进行取余的时候余mod-1,因为矩阵求出来是要当作幂的,就是a^b%p=a^(b%(p-1))%p #include<map> #includ

hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)

题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description Holion August will eat every thing he has found. Now there are many foods,but he does not want to eat all of them at once,so he fi