快速幂

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

  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


 

转载于:https://www.cnblogs.com/mabeyTang/p/10263941.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值