斐波那契额数列 矩阵快速

来源:互联网 发布:python re group 编辑:程序博客网 时间:2024/06/10 22:19
#include <iostream>using namespace std;typedef long long ll;const int MOD = 1e9 + 7;#define mod(a) (ll(a)%MOD)struct MATRIX{ll a[2][2];};MATRIX a;ll f[2];void ANS_Cf(MATRIX a) {f[0] = mod(a.a[0][0] + a.a[1][0]);f[1] = mod(a.a[0][1] + a.a[1][1]);return ;}MATRIX MATRIX_Cf(MATRIX a, MATRIX b) {MATRIX ans;int k;for(int i = 0; i < 2; i++) {for(int j = 0; j < 2; j++) {ans.a[i][j] = 0;k = 0;while(k < 2) {ans.a[i][j] += a.a[k][i]*b.a[j][k];ans.a[i][j] = mod(ans.a[i][j]);++k;}}}return ans;}MATRIX MATRIX_Pow(MATRIX a , ll n) {MATRIX ans;ans.a[0][0] = 1;ans.a[1][1] = 1;ans.a[0][1] = 0;ans.a[1][0] = 0;while(n) {if(n & 1) {ans = MATRIX_Cf(ans , a);}n >>= 1;a = MATRIX_Cf(a , a);}return ans;}int main() {ll n;while(cin >> n) {if(n == 1) {cout<<'1'<<endl;continue;}a.a[0][0] = a.a[0][1] = a.a[1][0] = 1;a.a[1][1] = 0;a = MATRIX_Pow(a , n - 2);ANS_Cf(a);cout<<f[0]<<endl;}return 0;}

原创粉丝点击