博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1575 Tr A(矩阵高速电源输入)
阅读量:7218 次
发布时间:2019-06-29

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

Tr A

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2977    Accepted Submission(s): 2217


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
 

裸的矩阵高速幂,然后取对角线的值即可了。

代码:

#include 
#include
#include
#include
using namespace std;int n;const int mod=9973;struct matrix{ int ma[13][13];}a;matrix multi(matrix x,matrix y)//矩阵相乘{ matrix ans; memset(ans.ma,0,sizeof(ans.ma)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(x.ma[i][j])//稀疏矩阵优化 for(int k=1;k<=n;k++) { ans.ma[i][k]=(ans.ma[i][k]+x.ma[i][j]*y.ma[j][k])%mod; } } } return ans;}matrix pow(matrix a,int m){ matrix ans; for(int i=1;i<=n;i++)//单位矩阵 { for(int j=1;j<=n;j++) { if(i==j) ans.ma[i][j]=1; else ans.ma[i][j]=0; } } while(m)//矩阵高速幂 { if(m&1) { ans=multi(ans,a); } a=multi(a,a); m=(m>>1); } return ans;}int main(){ int t; scanf("%d",&t); while(t--) { int m; scanf("%d%d",&n,&m); matrix a; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a.ma[i][j]); } } a=pow(a,m); int ans=0; for(int i=1;i<=n;i++)//取对角线上的元素 ans=(ans+a.ma[i][i])%mod; printf("%d\n",ans); } return 0;}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
puppeteer 填充基础表单
查看>>
邻接表存储
查看>>
web 常用开发工具
查看>>
Silverlight LoaderException错误
查看>>
qt5.4.1的imx6编译
查看>>
我的window10
查看>>
【转载】jQuery的.live()和.die()
查看>>
函数式编程--函数式接口
查看>>
python--常用模块calendar
查看>>
register form
查看>>
Java中的clone
查看>>
Lucene基础(2)
查看>>
Oracle 存储过程
查看>>
java基础 静态 static 问在多态中,子类静态方法覆盖父类静态方法时,父类引用调用的是哪个方法?...
查看>>
FlasCC发布说明
查看>>
如何在macOS Sierra中运行CORE Keygen破解程序
查看>>
终极解决方案:windows10资源管理器假死
查看>>
【java】一维数组循环位移方阵
查看>>
Essential Studio for mobile MVC中创建Razor应用程序平台教程
查看>>
java主函数的含义
查看>>