矩阵快速幂 hud 1575 Tr A 模板 *
2024-09-01 07:15:14
Tr A
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5366 Accepted Submission(s): 4024
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的内容。
每组数据的第一行有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
Author
xhd
Source
矩阵快速幂的模板题
#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 9973
#define maxn 12
using namespace std;
struct mat{
int s[maxn][maxn],n;
mat (int n1){//构造器
n = n1;
memset(s,,sizeof(s));//一定要初始化
}
void init(){
for(int i=;i<=n;i++){//单位矩阵的初始化,切记!
s[i][i] = ;//如果没有这个的话就不能直接相乘
}
}
mat operator * (const mat m){
mat ans(this->n);//理解this的用法
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
for(int k=;k<=n;k++){
ans.s[i][j] = (ans.s[i][j] + this->s[i][k] * m.s[k][j])%mod;
}
}
}
return ans;
}
};
mat quick_mod(mat &m,int p){//和整数快速幂一样的方法,只不过这里面的乘是矩阵的相乘
mat ans(m.n);
ans.init();// ans一定要为单位矩阵的!
while(p){
if(p&){
ans = ans * m;
}
m = m*m;
p >>= ;
}
return ans;
}
int main()
{
int t,n,k;
cin >> t;
while(t--){
cin >> n >> k;
mat m(n);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
cin >> m.s[i][j];
}
}
mat ans(n);
ans = quick_mod(m,k);
int sum = ;
for(int i=;i<=n;i++){
sum = (sum+ans.s[i][i])%mod;
}
cout << sum << endl;
}
return ;
}
最新文章
- 我的SpringMVC配置
- 简单的mysql封装类
- codeforces A. Cinema Line 解题报告
- jquery ztree插件
- WEB 中的一些名词解释
- 阿里Android一面(校招)
- Mybatis实战之TypeHandler高级进阶
- 关于python编译的一点小结
- 发送POST测试请求的若干方法
- 【CJOJ P2226】[省常中2011S4] 圣诞节
- 库函数strstr的实现
- dataframe常用处理
- js获取今天是星期几
- Asp.net core 学习笔记 (Excel 读写)
- day03 字符串
- tf.placeholder使用说明
- 【jemter】HTTP请求参数化
- Oracle常见的异常处理
- jdbc注册驱动 class.forName()
- iPhone开发资源汇总