首页 > 其他分享 >快速幂

快速幂

时间:2022-08-24 20:58:26浏览次数:59  
标签:matrix int ll 单位矩阵 maxn ans 快速

快速幂

 例题:P1226 【模板】快速幂||取余运算
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a, b, p;
int main() {
    cin >> a >> b >> p;
    int aa = a, bb = b;
    ll ans = 1;
    while (b) {
        if (b % 2 == 1) {
            ans = (ll)ans * a % p;
        }
        b /= 2;
        a = (ll) a * a % p;
    }
    printf("%d^%d mod %d=%ld\n", aa, bb, p, ans);

    return 0;
}

 

 

矩阵快速幂

 1.矩阵乘法

for(i = 1; i <= r; i ++) {
    for(j = 1; j <= c; j ++) {
        mul[i][j] = 0; 
        for(k = 1; k <= c; k ++) { 
            mul[i][j] += a[i][k] * b[k][j]; 
        } 
    } 
} 

 

 2.重载运算符

matrix operator *(const matrix &x, const matrix &y) {
     matrix z;
     for(int i = 1; i <= n; i ++) {
         for(int j = 1; j <= n; j ++) {
             for(int k = 1; k <= n; k ++) {
                 z.a[i][j] = (z.a[i][j] + x.a[i][k] * y.a[k][j] % mod) % mod;             
             }
         }
     }     
     return z;
}

 

 3.单位矩阵

  误区:单位矩阵是左上右下对角线上元素全为1,并不是所有元素全为1。

struct matrix {
    ll a[maxn][maxn];
    matrix() {
        memset(a, 0, sizeof(a));
    }
    //构造单位矩阵 
    inline void build() {
        for(int i = 1; i <= n; i ++) {
            a[i][i] = 1; 
        }
    }
};

 

  P3390 【模板】矩阵快速幂  
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 150;
const int mod = 1e9 + 7;
int n;
ll k;

struct matrix {
    ll a[maxn][maxn];
    matrix() {
        memset(a, 0, sizeof(a));
    }
    //构造单位矩阵 
    inline void build() {
        for(int i = 1; i <= n; i ++) {
            a[i][i] = 1; 
        }
    }
}m;

//重载运算符
matrix operator *(const matrix &x, const matrix &y) {
     matrix z;
     for(int i = 1; i <= n; i ++) {
         for(int j = 1; j <= n; j ++) {
             for(int k = 1; k <= n; k ++) {
                 z.a[i][j] = (z.a[i][j] + x.a[i][k] * y.a[k][j] % mod) % mod;             
             }
         }
     }
             
     return z;
}

int main() {
    cin >> n >> k;
    for (int i = 1; i <= n; i ++) {
        for (int j = 1; j <= n; j ++) {
            cin >> m.a[i][j];
        }
    }
    matrix ans;
    ans.build();
    
    while(k) {
        if(k & 1) {//奇数(不能被2整除) 
            ans = ans * m;
        }
        k >>= 1;
        m = m * m;
    }
    
    for(int i = 1; i <= n; i ++) {
        for(int j = 1; j <= n; j ++) {
            cout << ans.a[i][j] << " ";
        }
        cout << "\n";
    }
    
    return 0;
}

 

标签:matrix,int,ll,单位矩阵,maxn,ans,快速
From: https://www.cnblogs.com/coding-inspirations/p/16621506.html

相关文章

  • Dubbo快速入门
    1、Dubbo是什么1、RPC是什么RemoteProcedureCall,远程过程调用(服务器间调用),是一种进程间的通信方式,是一种技术的思想而不是规范。允许程序调用另一个地址空间的函数或......
  • HCIA学习笔记二十二:RSTP快速生成树
    一、RSTP快速生成树• RapidSpanningTreeProtocol快速生成树。• RSTP是STP的升级版本,与STP相比,最显著的特点就是通过新的机制,加快了收敛速度。二、交换机端口角......
  • 什么是ELK(小白简单快速的认识什么是ELK)
    今天继续给大家介绍Linux运维相关知识,本文主要内容是ELK的基本原理。一、ELK简介ELK是三个软件的统称,即Elasticsearch、Logstash和Kibana三个开源软件的缩写。这三款软件......
  • 三种分页方式-JWT原理-Django中快速使用JWT-修改返回格式-JWT的验证-自定义用户签发To
    三种分页方式#什么样接口要分页----》获取所有#三种分页方式---》继承GenericAPIView,ListModelMixin-list方法---》分页的使用 page.pyfromrest_framework.p......
  • GIT--快速入门
    本文仅用于作者个人学习记录,如有侵权请联系删除什么是Git分布式版本控制和源代码管理系统软件GIT中的基础概念GIT分区Workspace:工作区  //通过gitinit创建的代......
  • WPF开发快速入门【0】前言与目录
    前言WPF是一个生不逢时的技术,刚推出的时候由于是XP时代,WPF技术有两个不方便的地方:1、由于操作系统没有自带Framework,需要另外安装,比较麻烦;2、程序第一次启动时,由于要加......
  • WPF开发快速入门【1】WPF的布局
    概述本文描述几款WPF中常用的布局控件。 GridGrid是WPF最常用的布局控件。 它把面板分割为固定长和宽的网格,子控件就放置在网格内。<Grid><Grid.Colu......
  • WPF开发快速入门【2】WPF的基本特性(Style、Trigger、Template)
    概述本文描述几个WPF的常用特性,包括:样式、触发器和控件模板。 样式/StyleStyle就是控件的外观,在XAML中,我们通过修改控件的属性值来设置它的样式,如:<!--直接定义styl......
  • WPF开发快速入门【3】WPF的基本特性(附加属性)
    概述本文描述WPF的附加属性。对于使用MVVM框架的项目,附加属性是非常重要的一个特性。 在MVVM框架下,ViewModel的代码通过控件的依赖属性来控制控件的,例如://ViewModel......
  • [笔记] 一种快速求 1 ~ n 逆元的方法
    我们现在要求1~n在modm意义下的逆元(n<m,m为素数)。对于一个[1,n]中的数i,我们令\(k=\lfloor\frac{m}{i}\rfloor,r=m\mod\i\)然后\(ki+r\equiv0(mod\m)\)两边......