博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【POJ3233】Matrix Power Series
阅读量:5083 次
发布时间:2019-06-13

本文共 1527 字,大约阅读时间需要 5 分钟。

题面

给出矩阵A,求S = A + A2 + A3 + … + Ak.

分析

矩阵的乘方是可以通过快速幂很快的推出来,主要是相加的问题

但是别忘了,虽然没有等比求和,但是矩阵是满足结合律的

因此求出了A + A2 + A3 + … + Ak/2后只需要乘Ak/2,就可以得到A(k/2)+1 + A(k/2)+2 + A(k/2)+3 + … + Ak

类似地,一直二分下去。(上面忽略了k的奇偶,写的时候要注意)

代码

#include
#include
#include
#include
using namespace std;struct email{ int x[33][33];}a,o;int n,m,k;email mul(email a,email b){ email c; memset(c.x,0,sizeof(c.x)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) c.x[i][j]=(a.x[i][k]*b.x[k][j]+c.x[i][j])%m; return c;}email add(email a,email b){ int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) a.x[i][j]+=b.x[i][j],a.x[i][j]%=m; return a;}email ksm(email a,int k){ if(k==1)return a; email b=ksm(a,k/2); b=mul(b,b); if(k&1)b=mul(b,a); return b;}email divide(email a,int k){ if(k==1)return a; if(k%2==0) { email b=divide(a,k/2); return mul(add(ksm(a,k/2),o),b); } else { email b=divide(a,(k)/2); return add(mul(add(ksm(a,k/2),o),b),ksm(a,k)); }}int main(){ scanf("%d%d%d",&n,&k,&m); for(int i=1;i<=n;i++)o.x[i][i]=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a.x[i][j]); email ans=divide(a,k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) printf("%d ",ans.x[i][j]); printf("\n"); } return 0;}

 

转载于:https://www.cnblogs.com/NSD-email0820/p/9898221.html

你可能感兴趣的文章
eclipse转到idea过程中的基本设置...
查看>>
需求分析
查看>>
hadoop-maven项目打包成可执行的jar
查看>>
[欧拉回路][并查集] Bzoj P3706 反色刷
查看>>
Python学习之路:guess_rx_wan
查看>>
字符串转化为可执行的方法
查看>>
select和epoll学习总结
查看>>
pku 3661 Running DP
查看>>
BZOJ4923 K小值查询(splay)
查看>>
被sleep开了个小玩笑
查看>>
算法基础之排序算法[图文]
查看>>
Bootstrap之导航条
查看>>
struts2源码的解读 .
查看>>
【LOJ116】有源汇有上下界最大流(模板题)
查看>>
iOS----------APP怎样做更安全
查看>>
"ServiceStack.Redis.RedisNativeClient”的方法“get_Db”没有实现。
查看>>
关于数论【polya计数法】
查看>>
bzoj3732: Network
查看>>
android post数据到服务器端工具类(包括postjson字符串、键值对)
查看>>
Java当中的IO(三)
查看>>