快速幂

矩阵运算与快速幂技巧

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

  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

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值