zoukankan      html  css  js  c++  java
  • 快速幂

    总结了一些相关知识,这里没有给出证明,以后有机会再补上。

      1 #include<iostream>
      2 #include<cstring>
      3 
      4 using namespace std; 
      5 
      6 typedef long long ll;
      7 const ll mod = 1000000009;
      8 const ll rank = 2;    // 矩阵的秩(我们这里都是满秩) 
      9 
     10 // 定义矩阵结构体 
     11 struct mat{
     12     ll A[rank][rank];
     13     void Init(){ // 初始化0矩阵 
     14         memset(A, 0, sizeof(A));
     15     }
     16     void InitI(){ // 初始化单位矩阵 
     17         memset(A, 0, sizeof(A)); // 唉最开始少了这么一句话,初始化就不对了 
     18         for(ll i=0;i<rank;i++)
     19             A[i][i] = 1;
     20     }
     21 };
     22 
     23 // 矩阵乘法
     24 mat MatMul(mat a, mat b)
     25 {
     26     mat s;
     27     s.Init();
     28     for(ll i=0;i<rank;i++)
     29         for(ll j=0;j<rank;j++){
     30             for(ll k=0;k<rank;k++){
     31                 s.A[i][j] += a.A[i][k]*b.A[k][j];
     32                 s.A[i][j] %= mod;
     33             }
     34         }
     35     return s;
     36 } 
     37 
     38 // 矩阵快速幂 
     39 mat QuickMatPow(mat a, ll n)
     40 {
     41     mat s;
     42     s.InitI();
     43     while(n)
     44     {
     45         if(n&1)    s = MatMul(s, a);
     46         a = MatMul(a, a);
     47         n >>= 1;
     48     }
     49     return s;
     50 }
     51 
     52 // 快速幂取模 (a^b)%c 
     53 int QuickPowMod(ll a, ll b, ll c)
     54 {
     55     int s = 1;a = a%c;
     56     while(b)
     57     {
     58         if(b&1) s = (s*a)%c;
     59         b >>= 1;
     60         a = (a*a)%c;
     61     }
     62     return s;
     63 }
     64 
     65 // 整数快速幂 x^N
     66 int QuickPow(int x,int N)
     67 {
     68     int res = x, ans = 1;
     69     while(N)
     70     {
     71         if(N&1) ans *= res;
     72         res *= res;
     73         N = N>>1;
     74     }
     75     return ans;
     76 }
     77 
     78 // 展示矩阵 
     79 void showMat(mat a)
     80 {
     81     for(ll i=0;i<rank;i++){
     82         for(ll j=0;j<rank;j++){
     83             cout<<a.A[i][j]<<" ";
     84         }
     85         cout<<endl;
     86     }    
     87 }
     88 
     89 int main()
     90 {
     91     cout<<QuickPowMod(2, 3, 5)<<endl;
     92     cout<<QuickPow(2, 8)<<endl;
     93     cout<<"输入矩阵:"<<endl;
     94     mat a;
     95     a.A[0][0] = 1;
     96     a.A[0][1] = 1;
     97     a.A[1][0] = 1;
     98     a.A[1][1] = 0;
     99     // 两个矩阵相乘 
    100     mat s = MatMul(a, a);
    101     showMat(s);
    102     // 矩阵快速幂 
    103     mat arr = QuickMatPow(a, 10000000000);
    104     showMat(arr);
    105     
    106     return 0;
    107 }
    View Code

    2019-01-13

    20:45:16


  • 相关阅读:
    【MyBatis】STDOUT_LOGGING和log4j日志
    【MyBatis】resultType与类的字段不同解决办法
    【MyBatis】SqlSession相关的生命周期及作用域
    【MyBatis】XML配置的官网说明
    【Junit】程序员都应会的白盒测试
    【MyBatis】增删改查语句入门
    【MyBatis】我的mybatis第一个程序
    【网络】HTTP知识点(1)
    InitializeComponent报错(提示不存在)
    leetcode 860柠檬水找零问题
  • 原文地址:https://www.cnblogs.com/mabeyTang/p/10263941.html
Copyright © 2011-2022 走看看