HDU 1575 Tr A (矩阵快速幂)
2015-08-05 14:30
281 查看
Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
Input
数据的第一行是一个T,表示有T组数据。每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
Output
对应每组数据,输出Tr(A^k)%9973。
Sample Input
2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
Sample Output
2 2686
顺被带上快速幂算法::
int quickpow(int m,int n,int k) { int b = 1; while (n > 0) { if (n & 1) b = (b*m)%k; n = n >> 1 ; m = (m*m)%k; } return b; }
本文代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=15; const int mod=9973; int n; struct node { int m[maxn][maxn]; }; node A,B; node mul(node a,node b) { node c; memset(c.m,0,sizeof(c.m)); int i,j,k; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ for(k=1;k<=n;k++){ c.m[i][j]+=a.m[i][k]*b.m[k][j]; c.m[i][j]=c.m[i][j]%mod; } } } return c; } node pow_mod(node a,int m) { node b; memset(b.m,0,sizeof(b.m)); for(int i=1;i<=n;i++) b.m[i][i]=1; while(m){ if(m&1) b=mul(a,b); m=m>>1; a=mul(a,a); } return b; } int main() { int m,i,j,ans,t; while(scanf("%d",&t)!=EOF){ while(t--){ scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=n;j++) { scanf("%d",&A.m[i][j]); A.m[i][j]%=mod; } } B=pow_mod(A,m); ans=0; for(i=1;i<=n;i++) { ans+=B.m[i][i]; ans%=mod; } printf("%d\n",ans); } } return 0; }
相关文章推荐
- 在代码中引入Null Object模式
- Android优化之代码优化
- webservice的简单示例的实现步骤
- android studio sdk更新 (2015-8-5)
- ListView实现下拉刷新及上拉加载更多的一种方式
- 最新抓取淘宝价格数据,图片标题的就更好抓了整合就好
- 单词翻译
- SVN(集中式源代码管理工具)
- Oracle常用动态视图和字典表
- OpenCV3.0 兼容VS2010与VS2013的问题
- HDU/HDOJ 1232 超详细题解(并查集入门教程)
- @InjectView的实例化
- 手游项目开发实用工具
- windbg 源码调试设置
- HTML——JAVASCRIPT——关灯效果
- Linux进程间通信
- 南邮 OJ 1307 子集树问题
- Android学习笔记——Android生命周期
- 多模板layout
- struts2页面到action中date类型自动转换