社区讨论
蒟蒻求助
P3390【模板】矩阵快速幂参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mi6ue9sq
- 此快照首次捕获于
- 2025/11/20 10:59 4 个月前
- 此快照最后确认于
- 2025/11/20 10:59 4 个月前
CPP
#include <bits/stdc++.h>
#define rep( i , l , r ) for( int i = (l) ; i <= (r) ; ++i )
#define per( i , r , l ) for( int i = (r) ; i >= (l) ; --i )
#define erep( i , u ) for( int i = head[(u)] ; ~i ; i = e[i].nxt )
using namespace std;
inline int _read(){
register int x = 0 , f = 1;
register char ch = getchar();
while( ch > '9' || ch < '0' ) { if( ch == '-' ) f = -1; ch = getchar(); }
while( ch >= '0' && ch <= '9' ){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
typedef long long ll;
const int maxn = 100 + 5;
const ll MOD = 1000000007ll;
int N , K;
struct Mat {
ll mat[maxn][maxn];
};
Mat operator * (Mat a, Mat b) {
Mat c;
memset(c.mat, 0, sizeof(c.mat));
int i, j, k;
for(k = 0; k < N; ++k) {
for(i = 0; i < N; ++i) {
if(a.mat[i][k] == 0) continue;
for(j = 0; j < N; ++j) {
if(b.mat[k][j] == 0) continue;
c.mat[i][j] = ( c.mat[i][j] + a.mat[i][k] * b.mat[k][j] ) % MOD;
}
}
}
return c;
}
Mat operator ^ (Mat a, int k) {
Mat c;
int i, j;
for(i = 0; i < N; ++i)
for(j = 0; j < N; ++j)
c.mat[i][j] = (i == j);
for(; k; k >>= 1) {
if( k & 1 ) c = c * a;
a = a * a;
}
return c;
}
int main(){
scanf("%d %d" , &N , &K);
Mat a , b ;
rep( i , 0 , N - 1 ) rep( j , 0 , N - 1 ) scanf("%d" , &a.mat[i][j]);
b = a ^ K;
rep( i , 0 , N - 1 ){
rep( j , 0 , N - 2 )
printf("%lld " , b.mat[i][j]);
printf("%lld\n" , b.mat[i][N - 1]);
}
return 0;
}
交了很多遍,但是没有找到问题在哪,求解。。
回复
共 5 条回复,欢迎继续交流。
正在加载回复...