1. 程式人生 > >Luogu P1962 斐波那契數列(矩陣乘法模板)

Luogu P1962 斐波那契數列(矩陣乘法模板)

傳送門(其實就是求斐波那契數列....)

累了

明天再解釋

#include<cstdio>
#define ll long long
using namespace std;
const ll mod = 1000000007;

struct matrix {
    ll ma[2][2];
};

matrix ans;
ll n;

matrix mul(matrix A,matrix B) {
    matrix C;
    C.ma[0][0] = C.ma[0][1] = C.ma[1][0] = C.ma[1][1] = 0;
    for(int i = 0
; i < 2; i++) for(int j = 0; j < 2; j++) for(int k = 0; k < 2; k++) C.ma[i][j] += A.ma[i][k] * B.ma[k][j] % mod; return C; } matrix quickpow(matrix A,ll n) { matrix B; B.ma[0][0] = B.ma[1][1] = 1; B.ma[0][1] = B.ma[1][0] = 0; while(n) {
if(n&1)B = mul(A,B); A = mul(A,A); n >>= 1; } return B; } int main() { scanf("%lld",&n); matrix A; A.ma[0][0] = A.ma[0][1] = A.ma[1][0] = 1; A.ma[1][1] = 0; ans = quickpow (A,n); printf("%lld",ans.ma[0][1]%mod); return 0; }
View Code