POJ 3233
2015-10-10 11:11
369 查看
【3233】 二分+矩阵
当n为偶数,Sn=(E+A^n/2)*Sn/2
当n为奇数,Sn=(E+A^n/2)*Sn/2+A^n
E为单位矩阵
当n为偶数,Sn=(E+A^n/2)*Sn/2
当n为奇数,Sn=(E+A^n/2)*Sn/2+A^n
E为单位矩阵
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; int n,k,m; struct mat { int a[35][35]; }; mat add(mat a,mat b) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(b.a[i][j]) a.a[i][j]=(a.a[i][j]+b.a[i][j])%m; } } return a; } mat mul(mat a,mat b) { mat ret; memset(ret.a,0,sizeof(ret.a)); for(int i=0;i<n;i++) { for(int k=0;k<n;k++) { if(a.a[i][k]) for(int j=0;j<n;j++) { if(b.a[k][j]) ret.a[i][j]=(ret.a[i][j]+a.a[i][k]*b.a[k][j]%m)%m; } } } return ret; } mat mpower(mat a,int li) { mat I; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { I.a[i][j]=(i==j); } } while(li) { if(li&1) I=mul(I,a); a=mul(a,a); li>>=1; } return I; } mat dfs(int li,mat A,mat I) { if(li==1) return A; mat s=dfs(li>>1,A,I); s=mul(s,add(I,mpower(A,li/2))); if(li&1) s=add(s,mpower(A,li)); return s; } int main() { scanf("%d%d%d",&n,&k,&m); mat A,I; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { scanf("%d",&A.a[i][j]); A.a[i][j]%=m; I.a[i][j]=(i==j); } } mat tmp = dfs(k,A,I); for(int i=0;i<n;i++) { for(int j=0;j<n-1;j++) { printf("%d ",tmp.a[i][j]); } printf("%d\n",tmp.a[i][n-1]); } return 0; }
相关文章推荐
- UVA-1605 Building for UN (构造)
- 某android4.4手机的SystemUI
- sql学习一 主键,联合主键,外键、索引 ,分区
- UVA - 11624 Fire!(BFS)
- Java集合的优化
- Android Service完全解析
- C++primer第五版笔记-第十八章用于大型程序的工具
- web前端有用的十个JQuery代码片段
- 嵌入式开发中常用商用软件的FreeWare替换
- 自定义Notification和Toast
- Windows远程桌面连接Ubuntu 14.04
- 支付宝接口开发总结
- HTML5、CSS3(笔记)
- C++primer第五版笔记-第十七章标准库特殊设施
- Integer类型比较
- AIX 永久修改环境变量
- abmr:块恢复特性测试自己主动
- Squid
- Jenkins(二) 安装、新建Jobs与删除及SVN配置
- 最小二乘法