快速幂及矩阵

来源:互联网 发布:中科院软件研究所待遇 编辑:程序博客网 时间:2024/06/12 01:36

快速幂及矩阵

基础快速幂

#include<cstdio>#include<iostream>using namespace std;typedef long long ll;int qpow(int a,int b,int mod){    int res=1;    for(ll i=1;i<=b;i<<=1,a=((ll)a*a)%mod)        if(i&b)res=((ll)res*a)%mod;    return res;}int main(){    ll b, p, k;    cin>>b>>p>>k;    cout<<b<<"^"<<p<<" mod "<<k<<"="<<qpow(b,p,k);    return 0;}

矩阵快速幂

#include<iostream>#include<cstdio>using namespace std;const int P=1e9+7; typedef long long ll;struct matrix{    int s[2][2];};matrix mul(matrix a, matrix b){    matrix ans;    int i,j,k;    for(i = 0; i < 2; i ++)        for(j = 0; j < 2; j ++)            for(k = 0; k < 2; k ++)                ans.s[i][j]=((ll)ans.s[i][j] + (ll)(a.s[i][k] * b.s[k][j]) % P) % P;    return ans;}matrix power(matrix a, int n){    matrix im;//单位矩阵     im.s[0][0] = im.s[1][1] = 1;    im.s[1][0] = im.s[0][1] = 0;    matrix b = a;    for(int i = 1; i <= n; i <<= 1, b = mul(b, b))        if(n & i) im = mul(im, b);    return im;}

应用:求斐波那契数列

int F(int n){    if (n == 0) return 1 % P;    else if(n == 1) return 1 % P;    else    {        matrix a;        a.s[0][0] = a.s[0][1] = a.s[1][0] = 1;        a.s[1][1] = 0;        a = power(a, n - 2);        int f = (long long) (a.s[0][0] + a.s[0][1]) % P;        return f;    }}int main(){    int n;    scanf("%d", & n);    cout << F(n) << endl;    return 0;}
0 0