HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)

M斐波那契数列

Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

Submit Status

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

Source

2013金山西山居创意游戏程序挑战赛——初赛(2)

题意如题。

题解:解题过程中会发现a和b的指数是斐波那契数列,b的指数是f[n],a的指数是f[n-1]。

   构造{Fn+1,Fn,Fn,Fn-1}的矩阵,当n=1的时候是{1,1,1,0},单位矩阵为{1,0,0,1}。

   利用矩阵快速幂可以求出a和b的指数,在这个过程中还要用到费马小定理。

   费马小定理:x的y次幂对M取模,如果M为素数且x和M互素,可以将y对(M-1)取模后再将结果对M取模。

   即如果p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p)。

   然后求a的an次幂和b的bn次幂的乘积并取余,分别利用二分快速幂即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define mod  1000000006
#define mod2 1000000007
typedef long long ll;
struct matrix
{
    ll data[2][2];
};
matrix I= {1,0,0,1};
matrix multi(matrix a,matrix b)
{
    matrix c;
    memset(c.data,0,sizeof(c.data));
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
            for(int k=0; k<2; k++)
            {
                c.data[i][j]+=(a.data[i][k]%mod)*(b.data[k][j]%mod);
                c.data[i][j]%=mod;
            }
    return c;
}
matrix pow(matrix a,ll b)
{
    matrix ans=I;
    while(b)
    {
        if(b&1)
        {
            ans=multi(ans,a);
            b--;
        }
        b>>=1;
        a=multi(a,a);
    }
    return ans;
}
ll pow2(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1)
        {
            ans*=a;
            ans%=mod2;
            b--;
        }
        b>>=1;
        a*=a;
        a%=mod2;
    }
    return ans;
}
int main()
{
    ll aa,bb,an,bn,n;
    while(scanf("%lld%lld%lld",&aa,&bb,&n)!=EOF)
    {
        matrix a= {1,1,1,0};
        matrix ans;
        ans=pow(a,n);
        bn=ans.data[0][1];
        an=ans.data[1][1];
        //cout<<"a: "<<an<<"  b: "<<bn<<endl;
        ll ans2=((pow2(aa,an)%mod2)*(pow2(bb,bn)%mod2))%mod2;
        printf("%lld\n",ans2);
    }
    return 0;
}
时间: 2025-02-01 19:51:00

HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)的相关文章

hdu 4704 费马小定理+快速幂

题意就是:做整数拆分,答案是2^(n-1) 由费马小定理可得:2^n % p = 2^[ n % (p-1) ]  % p 当n为超大数时,对其每个数位的数分开来加权计算 当n为整型类型时,用快速幂的方法求解 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const in

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

MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3) mod 1000000007 是质数 , 根据费马小定理  a^phi( p ) = 1 ( mod p )  这里 p 为质数 且 a 比 p小 所以 a^( p - 1 ) = 1 ( mod p ) 所以对很大的指数可以化简  a ^ k % p  == a ^ ( k %(p-1) ) % p 用矩阵快速幂求fib数后代入即可 M斐波那契数列 Time Limit: 3000/1000

HDOJ 5667//费马小定理 矩阵快速幂

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5667 题意:如题给了一个函数式,给你a,b,c,n,p的值,叫你求f(n)%p的值 思路:先对函数取以a为底的log,令g(n)=log(a)(f(n)),结果就能得到 g(n)=b+c*g(n-1)+g(n-2);(n>3) g(n)=0;(n=1) g(n)=b;(n=2) g(n)  c  1  1  g(n-1) 用矩阵表示出来就是 g(n-1) = 1  0  0    *  g(n-2)  

bzoj5118: Fib数列2(费马小定理+矩阵快速幂)

题目大意:求fib(2^n) 就是求fib矩阵的(2^n)次方%p,p是质数,根据费马小定理有 于是这题就完了 注意因为模数比较大会爆LL,得写快速乘法... #include<bits/stdc++.h> #define ll long long #define MOD(x) ((x)>=mod?(x-mod):(x)) using namespace std; const int maxn=500010; const ll mod=1125899839733759; struct m

【费马小定理+矩阵快速幂】HDU4549——M斐波那契数列

[题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,求出F[n]的值. [思路] 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 typedef long

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,

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斐波那契数列 ( 矩阵快速幂 + 费马小定理 )

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 (矩阵快速幂+费马小定理)

题意:已知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>