HDU4549 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

解题思路:这道题题意很好懂,就是有多组测试数据,每组数据包括a,b,n( 0 <= a, b, n <= 10^9 )(所以均需要用long long型)然后可以利用矩阵快速幂求出对应n值的a的幂value2和b的幂value1,由于value2和value1都非常大,可能超过long long 型,且又分别作为a的幂和b的幂,由费马小定理(a^b%mod=a^(b%(mod-1))%mod)分别给a和b降幂,最后即可计算出结果;

代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
//构造结构体
struct matrix{
    ll m[2][2];
    matrix(){
     memset(m,0,sizeof(m));
    }
};
//矩阵相乘
matrix mat_multi(matrix a,matrix b){
    matrix c;
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            c.m[i][j]=0;
            for(int k=0;k<2;k++){
                c.m[i][j]+=(a.m[i][k]*b.m[k][j])%(mod-1);
                c.m[i][j]%=(mod-1);
            }
        }
    }
    return c;
}
//矩阵快速幂
matrix mat_quickpow(matrix d,ll e){
    matrix ans;
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            if(i==j) ans.m[i][j]=1;
            else ans.m[i][j]=0;
        }
    }
    while(e){
        if(e&1) ans=mat_multi(ans,d);
        d=mat_multi(d,d);
        e/=2;
    }
    return ans;
}
//快速幂
ll quickpow(ll a,ll b){
    ll sum2=1;
    while(b){
        if(b&1) sum2=(sum2*a)%mod;
        a=(a*a)%mod;
        b/=2;
    }
    return sum2;
}
//主函数
int main(){
 ll a,b,n;
 while(scanf("%lld %lld %lld",&a,&b,&n)!=EOF){
     matrix ans,d;
     ll value1,value2;
    ll sum2=0;
     ll sum=0;
     d.m[0][0]=d.m[0][1]=d.m[1][0]=1;
     d.m[1][1]=0;
     ans=mat_quickpow(d,n);
     value1=ans.m[0][1];
     value2=ans.m[1][1];
     sum2=(quickpow(a,value2)*quickpow(b,value1))%mod;
     printf("%lld\n",sum2);
 }
 return 0;
}

原文地址:https://www.cnblogs.com/jianqiao123/p/11438418.html

时间: 2024-08-03 19:44:14

HDU4549 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斐波那契数列(矩阵快速幂&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]

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

Problem DescriptionM斐波那契数列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 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上的指数成斐波

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,

UVA10299- Modular Fibonacci(斐波那契数列+矩阵快速幂)

题目链接 题意:给出n和m,求出f(n) % m, f(x)为斐波那契数列. 思路:因为n挺大的,如果直接利用公式计算很有可能会TLE,所以利用矩阵快速幂求解,|(1, 1), (1, 0)| * |f(n - 1), f(n - 2)| = |f(n), f(n - 1)|,所以求f(n)相当于|f(1), f(0)|乘上n - 1次的|(1, 1), (1, 0)|. 代码: #include <iostream> #include <cstdio> #include <

hdu 4549 M斐波那契数列 矩阵快速幂+欧拉定理

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) 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,

HDU 4549 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]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行. Samp

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