POJ 3233 矩阵快速幂&二分
2016-07-20 22:30
323 查看
题意:
给你一个n*n的矩阵 让你求S:
思路:
只知道矩阵快速幂 然后nlogn递推是会TLE的。
所以呢 要把那个n换成log
那这个怎么搞呢
二分!
就按照这么搞就能搞出来了
(我是看的题解才A的,,, 中间乱搞的时候犯了一些脑残的错误)
// by SiriusRen #include <cstdio> #include <cstring> using namespace std; int n,mod,k; struct matrix{int a[33][33];void init(){memset(a,0,sizeof(a));}}first; matrix mul(matrix a,matrix b){ matrix temp;temp.init(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) temp.a[i][j]=(temp.a[i][j]+a.a[i][k]*b.a[k][j])%mod; return temp; } matrix add(matrix a,matrix b){ matrix temp;temp.init(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) temp.a[i][j]=(a.a[i][j]+b.a[i][j])%mod; return temp; } matrix pow(matrix a,int x){ matrix temp; x--; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) temp.a[i][j]=a.a[i][j]; while(x){ if(x&1)temp=mul(temp,a); a=mul(a,a),x>>=1; } return temp; } matrix recursive(int x){ if(x==1)return first; matrix temp=recursive(x/2); if(x&1){ matrix jy=pow(first,x/2+1); temp=add(temp,mul(temp,jy)); return add(jy,temp); } else{ matrix jy=pow(first,x/2); return add(mul(jy,temp),temp); } } int main(){ scanf("%d%d%d",&n,&k,&mod); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ scanf("%d",&first.a[i][j]); first.a[i][j]=first.a[i][j]%mod; } matrix jy=recursive(k); for(int i=1;i<=n;i++){ for(int j=1;j<n;j++) printf("%d ",jy.a[i][j]); printf("%d\n",jy.a[i] ); } }
相关文章推荐
- HDU 4609 3-idiots FFT+容斥
- 继上一篇,制作序列化类的编辑器
- PHP的数组转String
- java面试题训练160720
- C++提高5 STL算法 :查找,统计,排序,拷贝,替换,算术,集合 |STL 案例:学校演讲比赛介绍
- Can’t connect to local MySQL server through socket 解决办法
- Git入门学习
- 理解java异常处理机制
- 分布式系统组件之配置中心
- 校外实习-7.20
- 算法导论_第十一章_散列表
- 使用Jersey+Spring+Tomcat构建RESTful Web服务
- Starting MySQL....The server quit without updating PID file 处理方法
- JavaSE基础(一)
- HDU3037——Saving Beans(数论,组合数取模,lucas定理模板)
- 13、存储过程和函数-----第2篇
- JUnit4的使用
- CentOS 下安装 SNMP 服务
- java面试题
- HDU 5727 Necklace(暴力+匈牙利)