您的位置:首页 > 其它

HDU4549 M斐波那契数列【矩阵快速幂】

2017-07-31 16:54 459 查看
题意:F0 = a ,F1 = b ,Fn
=  Fn-1 * Fn-2  (n > 1),求Fn

思路:F2 = a*b

          F3 = a*b^2

         F4 = a^2*b^3

         F5 = a^3*b^5

         F6 = a^5*b^8

         观察易得:

         Fn = a^fib(n-1) * b^fib(n) % MOD

          想当然的给它的指数mod了下,a^b % m,带值2 4 3。正确是1,mod后是2

          其实正确的是:

             a^b % m,m是质数,而且a,m是互质的。
          根据欧拉定理a^(b%(m-1)) % m

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<list>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
typedef long long ll;
const int maxn = 5;

int MOD,N,a[maxn];
struct data
{
ll s[maxn][maxn];
}res,tp;

void init()
{
memset(res.s,0,sizeof res.s);
memset(tp.s,0,sizeof tp.s);
for(int i = 1; i <= N; i++)
res.s[i][i] = 1;
tp.s[1][1] = tp.s[1][2] = tp.s[2][1] = 1;
}

struct data mat(struct data &x,struct data &y)
{
struct data temp;
memset(temp.s,0,sizeof temp.s);
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= N; j++)
{
for(int k = 1; k <= N; k++)
{
temp.s[i][j] += x.s[i][k] * y.s[k][j];
temp.s[i][j] %= (MOD-1);
}
}
}
return temp;
}

struct data mpow(struct data &a,ll b)
{
while(b)
{
if(b&1) res = mat(res,a);
b >>= 1;
a = mat(a,a);
}
return res;
}

ll kuai(ll a,ll b)
{
ll res = 1;
while(b)
{
if(b&1) res = res * a % MOD;
b >>= 1;
a = a * a % MOD;
}
return res;
}

int main(void)
{
ll n,m,a,b;
ll A,B;
MOD = 1e9+7;
N = 2;
while(scanf("%lld%lld%lld",&a,&b,&n)!=EOF)
{
if(n == 0)
{
printf("%lld\n",a);
continue;
}
else if(n == 1)
{
printf("%lld\n",b);
continue;
}
else
{
init();
res = mpow(tp,n);
A = res.s[2][1] % (MOD-1);
B = res.s[1][1] % (MOD-1);
//printf("%d %d\n",A,B);
}
ll ans = kuai(a,A) % MOD;
ans = ans * kuai(b,B) % MOD;
ans = ( (ans%MOD)+MOD ) % MOD;
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: