当前位置: 首页 > news >正文

做抛物线的网站/热门职业培训班

做抛物线的网站,热门职业培训班,北京好网站制作公司,wordpress添加菜单1.什么是矩阵? 矩阵(数学术语)_百度百科 2.矩阵快速幂 首先要知道,只有n*n的矩阵能乘以自身(否则不符合矩阵相乘的条件) 然后要明白普通的快速幂的原理(本质是把幂次二分,代码如下…

1.什么是矩阵?

矩阵(数学术语)_百度百科


2.矩阵快速幂

首先要知道,只有n*n的矩阵能乘以自身(否则不符合矩阵相乘的条件)

然后要明白普通的快速幂的原理(本质是把幂次二分,代码如下)

inline int Pow(int a,int b){long long res=1, bs=a;while(b>0){if(b&1) res=res*bs%mod; bs=bs*bs%mod; b>>=1;}return res;
}

这里最终答案res从1开始,逐步让res乘以base值,以及让base值翻倍,从而达到了二分幂次的效果。

换成矩阵,思路完全一样。但是要进行两个替换:

  1. 把 res=1 换成 res等于一个单位矩阵。
  2. 数字相乘换成矩阵相乘,这一步可以用运算符重载来完成。

 附上模板题链接和代码:【模板】矩阵快速幂 - 洛谷

#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define int long long
#define pii pair<int,int>
const int N = 105, mod=1e9+7;
int n, k; //矩阵大小,矩阵次方
struct juzhen{int a[N][N];juzhen(){memset(a,0,sizeof(a));} //初始为0矩阵inline void build(){FOR(i,1,n) a[i][i]=1;} //建立单位矩阵void print(){FOR(i,1,n){FOR(j,1,n) cout<<a[i][j]<<' ';cout<<'\n';}}juzhen operator*(const juzhen& b){ //重载矩阵乘法juzhen res;FOR(i,1,n) FOR(j,1,n){FOR(k,1,n) res.a[i][j] = (res.a[i][j] + this->a[i][k]*b.a[k][j]%mod)%mod;}return res;}
}a;void solve(){cin>>n>>k;FOR(i,1,n) FOR(j,1,n) cin>>a.a[i][j];juzhen ans; ans.build(); //从一个单位矩阵开始while(k>0){ //矩阵快速幂计算if(k&1) ans=ans*a;a = a*a; k>>=1;}ans.print();
}
signed main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T=1; //cin>>T;while(T--) solve();
}

3.矩阵加速 

矩阵加速可以用来计算一些dp的计算,加速的原理就是前面说到的矩阵快速幂。

1) 首先我们以一个简单的问题引入:斐波那契数列 - 洛谷

这就是普通的斐波那契数列,但是n值达到了恐怖的2e9,显然原本O(n)的普通dp思路不可行。

那么,我们就要用到矩阵加速了。

考虑构造一个1*2的矩阵[f[i-1],f[i]],用这个矩阵进行递推。

由斐波那契的递推式f[i] = f[i-2]+f[i-1]

得到矩阵的递推式[f[i-1],f[i]] = [f[i-2],f[i-1]]*\begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}

再得到最终的计算式[f[n-1],f[n]] = [f[0],f[1]]*\begin{bmatrix} 0 & 1\\ 1 & 1 \end{bmatrix} ^{n-1}

最终代码如下:

#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define int long long
#define pii pair<int,int>
const int mod = 1e9+7;
int n;struct node{int a[3][3];node(){memset(a,0,sizeof(a));} //初始为0矩阵void build(){a[1][1]=0,a[1][2]=a[2][1]=a[2][2]=1;} //建立变换矩阵node operator*(const node&b){node res;FOR(i,1,2) FOR(j,1,2){FOR(k,1,2) res.a[i][j] = (res.a[i][j]+a[i][k]*b.a[k][j]%mod)%mod;}return res;}
};
node Pow(node a, int b){node res; res.a[1][1]=res.a[2][2]=1; //建立res为单位矩阵while(b>0){ //矩阵快速幂if(b&1) res=res*a;a=a*a; b>>=1;}return res;
}
pii cheng(pii a, node b){pii res;res.first = (a.first*b.a[1][1]%mod + a.second*b.a[2][1]%mod)%mod;res.second = (a.first*b.a[1][2]%mod + a.second*b.a[2][2]%mod)%mod;return res;
}
void solve(){cin>>n;node a; a.build();a = Pow(a,n-1);cout<<cheng({0,1},a).second<<'\n';
}
signed main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T=1; //cin>>T;while(T--) solve();
}

2) 再推广到一般的矩阵加速,也是一样的做法,看下这道题:【模板】矩阵加速(数列) - 洛谷

容易得到矩阵转移式为:[a,b,c]\rightarrow [b,c,a+c] 

所以这次的转换矩阵就变成了\begin{bmatrix} 0 & 0 & 1\\ 1 & 0 & 0\\ 0 & 1 & 1 \end{bmatrix}

最终代码如下:

#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define int long long
#define pii pair<int,int>
const int mod = 1e9+7;
int n;struct node{int a[4][4];node(){memset(a,0,sizeof(a));} //初始为0矩阵void build(){a[1][3]=a[2][1]=a[3][2]=a[3][3]=1;} //建立变换矩阵node operator*(const node&b){node res;FOR(i,1,3) FOR(j,1,3){FOR(k,1,3) res.a[i][j] = (res.a[i][j]+a[i][k]*b.a[k][j]%mod)%mod;}return res;}void print(){FOR(i,1,3){FOR(j,1,3) cout<<a[i][j]<<' ';cout<<'\n';}}
};
node Pow(node a, int b){node res; res.a[1][1]=res.a[2][2]=res.a[3][3]=1; //建立res为单位矩阵while(b>0){ //矩阵快速幂if(b&1) res=res*a;a=a*a; b>>=1;}return res;
}
struct tii{int a[4];tii(){memset(a,0,sizeof(a));}tii(int x,int y,int z){a[1]=x,a[2]=y,a[3]=z;}
};
tii cheng(tii a,node b){tii res;FOR(i,1,3){FOR(j,1,3) res.a[i] = (res.a[i] + a.a[j]*b.a[j][i]%mod)%mod;}return res;
}
void solve(){cin>>n;node a; a.build();a = Pow(a,n-1);cout<<cheng(tii(0,0,1),a).a[3]<<'\n';
}
signed main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T=1; cin>>T;while(T--) solve();
}

http://www.lbrq.cn/news/1068067.html

相关文章:

  • 青海城乡住房建设厅网站/seo的中文意思
  • 站长之家alexa排名/品牌推广的方式
  • wordpress obj cache/上海百度seo公司
  • 给一个网站/汽车品牌推广策划方案
  • 古典风格网站模板/怀来网站seo
  • 网站做图尺寸/百度网盘搜索引擎入口哪里
  • 云南省人防工程建设网站/手机网站建设价格
  • 深圳网站建设信科便宜/知乎关键词排名工具
  • 怎么用手机开发app/上海外贸网站seo
  • 注册一个做网站的公司好/好的seo平台
  • 安徽网站建设服务平台/代推广app下载
  • 网站建设优化服务精英/郑州疫情最新动态
  • 简述网站的建设流程图/市场营销咨询
  • 局网站建设工作/百度竞价sem
  • 网站相册源码/广告策划方案范文
  • 家在深圳业主论坛/福州百度快速优化
  • 做yield网站多少钱/重庆二级站seo整站优化排名
  • 创同盟做网站/国产搜什么关键词最好看
  • 做网站发布网/seo培训公司
  • 武汉自媒体公司/seo站群优化技术
  • 装饰公司起名字寓意好的字/高级seo课程
  • 搞个网站要多少钱/建站优化公司
  • 长沙如何优化排名/seo数据是什么
  • 扁平化网站建设公司/杭州百度公司在哪里
  • 分销网站/seo公司优化
  • 做网站九州科技/友情链接地址
  • 中国住房和城乡建设部网站注册中心/百度网站推广费用多少
  • 哪家做网站/网站分析工具
  • 工商局网站做年报/建设企业营销型网站
  • 网站建设有什么工作/网站及搜索引擎优化建议
  • 多租户字典管理系统完整设计
  • C++编译过程与GDB调试段错误和死锁问题
  • e2studio开发RA4M2(6)----GPIO外部中断(IRQ)配置
  • Linux 摄像头实时抓取:V4L2、FFmpeg 与 GStreamer 全面讲解
  • Unix 发展史概览
  • 蓝桥杯----串口