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
= 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; }
相关文章推荐
- hdu4549 M斐波那契数列 (矩阵快速幂+费马小定理)
- hdu4549 M斐波那契数列 矩阵快速幂+快速幂
- hdu4549 M斐波那契数列(矩阵快速幂)
- hdu4549 M斐波那契数列 【矩阵快速幂+快速幂+欧拉函数降次】
- hdu-4549 M斐波那契数列【矩阵快速幂】
- 矩阵乘法 与 矩阵快速幂详解 以51NOD1242 斐波那契数列的第N项为例
- hdoj 4549 M斐波那契数列 【矩阵快速幂 + 费马小定理 + 快速幂】
- 矩阵快速幂之斐波那契数列的前1000,000,000项mod10000
- HDOJ 题目4549 M斐波那契数列(数学,矩阵快速幂,费马小定理)
- HDU 4549 M斐波那契数列(费马小定理,矩阵快速幂,快速幂)
- 2017 ACM/ICPC Asia Regional Shenyang Online E题【number number number】--矩阵快速幂与斐波那契数列
- HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)
- hdoj 4549 M斐波那契数列(费马小定理降幂,矩阵快速幂)
- 矩阵快速幂优化递推式 例:斐波那契数列
- E - M斐波那契数列 (费马小定理 + 二分快速幂 + 矩阵快速幂)
- hdoj M斐波那契数列 4549&nyoj 又见斐波那契数列 1000 (矩阵快速幂&规律)
- 斐波那契数列 (矩阵快速幂)
- NYOJ_1000又见斐波那契数列_矩阵快速幂+费马小定理
- HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)
- HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)