【数论】 快速幂&&矩阵快速幂
首先复习快速幂
- #include<bits/stdc++.h>
- using namespace std;
- long long power(long long a,long long b,long long k)
- {
- long long ans=,base=a;
- while (b>)
- {
- if(b&)
- {
- ans*=base;
- ans%=k;
- }
- base*=base;
- base%=k;
- b>>=;
- }
- return ans;
- }
- int main()
- {
- long long b,p,k;
- cin>>b>>p>>k;
- cout<<b<<'^'<<p<<" mod "<<k<<"="<<(power(b,p,k) % k);
- return ;
- }
我居然不DEFINE LL?可以看到上面的码十分好懂
那么矩阵快速幂也是一样的 只不过把*换成了mul函数
用计算机模拟矩阵乘法是这样的
- struct mat{
- long long m[][];//这里不开ll会死人
- };
- mat mul(mat x,mat y){
- mat r;
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++){
- r.m[i][j] = ;
- }
- }
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++){
- for(int k=;k<=n;k++){
- r.m[i][j] += (x.m[i][k] * y.m[k][j]) % p;
- r.m[i][j] %= p;
- }
- }
- }
- return r;
- }
首先定义一个矩阵并赋初值0 然后模拟乘的过程
什么?你想看矩阵乘法的公式?我不会MARKDOWN啊百度麻烦您了
还有一个小问题 就是在矩阵乘法中 什么矩阵是“1"?
答案就是(1,1)(2,2)(3,3).....(N,N)=1 其他地方为0的矩阵(可以自己手动模拟一下)
好了上完整代码
- #include<bits/stdc++.h>
- #define ll long long
- #define p 1000000007
- using namespace std;
- struct mat{
- long long m[][];
- }e,ans1,ans2;
- ll k,n;
- mat mul(mat x,mat y){
- mat r;
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++){
- r.m[i][j] = ;
- }
- }
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++){
- for(int k=;k<=n;k++){
- r.m[i][j] += (x.m[i][k] * y.m[k][j]) % p;
- r.m[i][j] %= p;
- }
- }
- }
- return r;
- }
- mat pow(mat x,ll y){
- mat ans = e;
- while (y>){
- if(y&){
- ans = mul(ans,x);
- }
- x=mul(x,x);
- y>>=;
- }
- return ans;
- }
- int main(){
- cin>>n>>k;
- for(int i=;i<=n;i++) e.m[i][i] = ;
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++){
- scanf("%d",&ans1.m[i][j]);
- }
- }
- ans2 =pow (ans1,k);
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++){
- printf("%d ",ans2.m[i][j]);
- }
- cout<<endl;
- }
- return ;
- }
你会了这个才会矩阵加速之类乱七八糟的东西
TAG:SIN_XIII ⑨
【数论】 快速幂&&矩阵快速幂的更多相关文章
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- 快速幂 & 矩阵快速幂
目录 快速幂 实数快速幂 矩阵快速幂 快速幂 实数快速幂 普通求幂的方法为 O(n) .在一些要求比较严格的题目上很有可能会超时.所以下面来介绍一下快速幂. 快速幂的思想其实是将数分解,即a^b可以分 ...
- jiulianhuan 快速幂--矩阵快速幂
题目信息: 1471: Jiulianhuan 时间限制: 1 Sec 内存限制: 128 MB 提交: 95 解决: 22 题目描述 For each data set in the input ...
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c 二.矩 ...
- 快速幂&&矩阵快速幂
快速幂 题目链接:https://www.luogu.org/problemnew/show/P1226 快速幂用了二分的思想,即将\(a^{b}\)的指数b不断分解成二进制的形式,然后相乘累加起来, ...
- [板子]快速幂&矩阵快速幂
不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html 简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性. x&a ...
- hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...
- 矩阵快速幂模板(pascal)
洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...
- 培训补坑(day10:双指针扫描+矩阵快速幂)
这是一个神奇的课题,其实我觉得用一个词来形容这个算法挺合适的:暴力. 是啊,就是循环+暴力.没什么难的... 先来看一道裸题. 那么对于这道题,显然我们的暴力算法就是枚举区间的左右端点,然后通过前缀和 ...
随机推荐
- EL有11个隐含对象
EL有11个隐含对象: 隐含对象 类型 说明 ...
- Typora/VSCode/Sublime 更改Markdown默认宽度样式等
Typora 所见即所得Markdown编辑器更改 最大宽度 C:\Users\Desk\AppData\Roaming\Typora\themes\github.css CSS第46行改为 max- ...
- 孙子兵法的计是最早的SWOT分析,《孙子兵法》首先不是战法,而是不战之法。首先不是战胜之法,而是不败之法
孙子兵法的计是最早的SWOT分析,<孙子兵法>首先不是战法,而是不战之法.首先不是战胜之法,而是不败之法 在打仗之前,你要详细地去算. 计算的目的是什么呢?孙子说,是为了知胜,就是为了知道 ...
- nodejs笔记之连接mysql数据库
1.安装mysql模块: npm install mysql 2.引入mysql模块 创建一个server.js文件 const http = require("http"); c ...
- 如何在Ubuntu 16.04上安装PythonGDAL 2.1?
sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable sudo apt update sudo apt upgrade # if yo ...
- centos6删除mysql安装
1.查看已经安装了的mysql包: 2.卸载mysql: 3.查看剩下的mysql安装包: 4.逐个删除剩下的mysql安装包: 5.删除完后再次查看,以确保已删除干净: 6.删除自己安装的mysql ...
- ltp-ddt nor_mtd_dd_rw_jffs2
nor_mtd_dd_rw_jffs2运行报错 error getting mtd part number: $part get_mtd_biggest_part for $DEVICE_TYPE: ...
- Event and Delegate
文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本文原更新于作者的github博客,这里给出链接. 委托 委托的实质是一个类. // 委托定义 delegate ReturnT ...
- Redis查漏补缺:最易错过的技术要点大扫盲
考虑到绝大部分写业务的程序员在实际开发中使用Redis时,只会Setvalue和Getvalue两个操作,对Redis整体缺乏一个认知.又恰逢笔者有同事下周要去培训Redis,所以笔者斗胆以Redis ...
- Bugku-CTF之速度要快
Day21 速度要快 速度要快!!!!!! http://123.206.87.240:8002/web6/