矩阵快速幂模板
来源:互联网 发布:唐山地震 知乎 编辑:程序博客网 时间:2024/06/06 01:45
矩阵快速幂模板,可用于求一个递推表达式的f(n)
重载运算符版:
#include<stdio.h>#include<string.h>#include<math.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<queue>#include<stack>using namespace std;const double EXP = 1e-9;typedef long long ll;const ll maxn = ;//确定矩阵大小const ll mod = ; //取余数用struct mat{ ll m[maxn][maxn];}unit; //unit为单位矩阵mat operator *(mat a,mat b) //俩矩阵相乘{ mat ans; ll x,i,j,k; for(i=0;i<maxn;i++) { for(j=0;j<maxn;j++) { x=0; for(k=0;k<maxn;k++) { x+=(a.m[i][k]*b.m[k][j])%mod; } ans.m[i][j]=x; } } return ans;}void init_unit() //初始化单位矩阵{ for(ll i=0;i<maxn;i++) unit.m[i][i]=1; return ;}mat pow_mat(mat a,ll n) //矩阵快速幂,求矩阵a的n次幂{ mat ans=unit; //unit为幺元 while(n) { if(n&1) ans=ans*a; a=a*a; n>>=1; } return ans;}int main(){ ll n,x,y; init_unit(); scanf("%lld",&t); while(t--) { scanf("%lld%lld%lld",&x,&y,&n);// 以下注释代码按具体情况而定// if(n==)// printf("\n")// else if()// else if() else { mat a,b; //a为表达式矩阵,b为快速幂矩阵// 以下为俩矩阵的初始化// b.m[0][0] = ,b.m[0][1] = ,...// b.m[1][0] = ,...// ...//// a.m[0][0] = ,...// ... b = pow_mat(b,x);//x次幂视具体题目而定 a = a*b; printf("%lld\n",(a.m[0][0]+mod)%mod); } } return 0;}
无重载运算符版:
#include<stdio.h>#include<string.h>#include<math.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<queue>#include<stack>using namespace std;const double EXP = 1e-9;typedef long long ll;const ll maxn = //确定矩阵大小const ll mod = //取余数用struct mat{ ll m[maxn][maxn];}unit; //unit为单位矩阵mat matmul(mat a,mat b) //俩矩阵相乘{ mat ans; ll x,i,j,k; for(i=0;i<maxn;i++) { for(j=0;j<maxn;j++) { x=0; for(k=0;k<maxn;k++) { x+=(a.m[i][k]*b.m[k][j])%mod; } ans.m[i][j] = x%mod; } } return ans;}void init_unit() //初始化单位矩阵{ for(ll i=0;i<maxn;i++) unit.m[i][i] = 1; return ;}mat pow_mat(mat a,ll n) //矩阵快速幂,求矩阵a的n次幂{ mat ans = unit; //unit为幺元 while(n) { if(n&1) ans=matmul(ans,a); a = matmul(a,a); n>>=1; } return ans;}int main(){ ll n,t; init_unit(); scanf("%lld",&t); while(t--) { scanf("%lld",&n);// 以下注释代码按具体情况而定// if(n==)// printf("\n")// else if()// else if() else { mat a,b; //a为表达式矩阵,b为快速幂矩阵// 以下为俩矩阵的初始化// b.m[0][0] = ,b.m[0][1] = ,...// b.m[1][0] = ,...// ...//// a.m[0][0] = ,...// ... b = pow_mat(b,x);//x次幂视具体题目而定 a = matmul(a,b); printf("%lld\n",a.m[0][0]%mod); } } return 0;}
阅读全文
0 0
- 矩阵快速幂模板
- 矩阵快速幂--模板
- 矩阵快速幂 模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 【矩阵快速幂模板】
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂【模板】
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂 【模板】
- 快速矩阵幂模板
- 深度学习领域PyTorch项目-git源码整理
- 形态学处理
- Stanford Core NLP
- C#Datatable导入sqlserver数据库中,三种常见,快捷的方法
- linux C 获取网关代码实现
- 矩阵快速幂模板
- 选择排序(排序算法--比较排序)
- DPDK-ELASTIC FLOW DISTRIBUTOR LIBRARY(灵活的流分发库)
- PyCharm无法使用Django新建项目:'django-admin.py'不是内部或外部命令
- WordPress 建站中15个常见的错误
- js中bind、call和apply的区别
- Openstack实例控制台无法打开的解决办法
- 解决error C1083: 无法打开包括文件: “sys/time.h”的问题
- C#——Redis队列模式