zoukankan      html  css  js  c++  java
  • 快速幂和矩阵快速幂模板

    快速幂模板:

    ll qmod(ll x,ll n,ll mod)
    {
        ll res=1;
        while(n){
            if(n&1) res=(res*x)%mod;
            x=(x*x)%mod;
            n/=2;
        }
        return res;
    }

    例题:hdu 1097

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const ll mod=10;
    
    ll qmod(ll x,ll n)
    {
        ll res=1;
        while(n){
            if(n&1) res=(res*x)%mod;
            x=(x*x)%mod;
            n/=2;
        }
        return res;
    }
    
    int main()
    {
        ll a,b;
        while(cin>>a>>b)
        {
            cout<<qmod(a,b)<<endl;
        }
        return 0;
    }
    hdu 1097

    矩阵快速幂:

     1 mat mul(mat &A, mat &B)
     2 {
     3     mat C(A.size(), vec(B[0].size()));///分配大小,A的行,B的列
     4     for (int i = 0; i<A.size(); i++) ///矩阵A的行
     5         for (int k = 0; k<B.size(); k++) ///矩阵B的行
     6             for (int j = 0; j<B[0].size(); j++) ///矩阵B的列
     7                 C[i][j] = (C[i][j] + A[i][k] * B[k][j] % mod + mod) % mod;
     8     return C;
     9 }
    10 ///计算A^n
    11 mat pow(mat A, LL n)
    12 {
    13     mat B(A.size(), vec(A.size()));///和矩阵A的大小相同
    14     for (int i = 0; i<A.size(); i++)
    15         B[i][i] = 1;
    16     while (n>0)
    17     {
    18         if (n & 1) B = mul(B, A);
    19         A = mul(A, A);
    20         n >>= 1;
    21     }
    22     return B;
    23 }
    24 void solve()
    25 {
    26     mat A(2, vec(2));///2*2的矩阵
    27     A[0][0] = 1;
    28     A[0][1] = 1;
    29     A[1][0] = 1;
    30     A[1][1] = 0;
    31     A = pow(A, n);
    32     printf("%d
    ", (A[1][0] % mod - 1 + mod) % mod);
    33 }

    例题:求F(2n+3)-1

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <vector>
     5 using namespace std;
     6 const int mod = 998244353;
     7 typedef long long LL;
     8 LL n;
     9 typedef vector<LL>vec;
    10 typedef vector<vec>mat;
    11 mat mul(mat &A, mat &B)
    12 {
    13     mat C(A.size(), vec(B[0].size()));///分配大小,A的行,B的列
    14     for (int i = 0; i<A.size(); i++) ///矩阵A的行
    15         for (int k = 0; k<B.size(); k++) ///矩阵B的行
    16             for (int j = 0; j<B[0].size(); j++) ///矩阵B的列
    17                 C[i][j] = (C[i][j] + A[i][k] * B[k][j] % mod + mod) % mod;
    18     return C;
    19 }
    20 ///计算A^n
    21 mat pow(mat A, LL n)
    22 {
    23     mat B(A.size(), vec(A.size()));///和矩阵A的大小相同
    24     for (int i = 0; i<A.size(); i++)
    25         B[i][i] = 1;
    26     while (n>0)
    27     {
    28         if (n & 1) B = mul(B, A);
    29         A = mul(A, A);
    30         n >>= 1;
    31     }
    32     return B;
    33 }
    34 void solve()
    35 {
    36     mat A(2, vec(2));///2*2的矩阵
    37     A[0][0] = 1;
    38     A[0][1] = 1;
    39     A[1][0] = 1;
    40     A[1][1] = 0;
    41     A = pow(A, n);
    42     printf("%d
    ", (A[1][0] % mod - 1 + mod) % mod);
    43 }
    44 int main()
    45 {
    46     while (~scanf("%lld", &n))
    47     {
    48         n = 2 * n + 3;
    49         solve();
    50     }
    51 }
    http://www.cnblogs.com/zxhyxiao/p/7577282.html
  • 相关阅读:
    Codeforces 1230E
    扫描线求面积和周长 (模板,线段树)
    POJ2528
    线段树 (模板)
    Codeforces 1332B
    Codeforces 1279D
    Codeforces 1281B
    Codeforces 1288D
    8I
    8F
  • 原文地址:https://www.cnblogs.com/zxhyxiao/p/7577288.html
Copyright © 2011-2022 走看看