数据弱
查看原帖
数据弱
1295409
akahoshi楼主2024/5/10 14:39

快速幂前不k--也能过

#include <bits/stdc++.h>
#define mod(a) (a) % modn

using namespace std;
typedef long long ll;

const int modn = 1e9+7;
const int N = 100+5; 
struct matrix{
	ll ma[N][N];
	inline matrix(){
		memset(ma, 0, sizeof(ma));
	}
};

inline matrix operator*(const matrix& a, const matrix& b){
	matrix c;
	for (ll i=0; i<N; i++){
		for (ll j=0; j<N; j++){
			for (ll k=0; k<N; k++){
				c.ma[i][j] = mod(mod(c.ma[i][j]) + mod(a.ma[i][k] * b.ma[k][j]));
			}
		}
	}
	return c;
}

inline matrix Ein(){
	matrix e;
	for (ll i=0; i<N; i++){
		e.ma[i][i] = 1;
	}
	return e;
}

inline void printMatrix(matrix ma, ll n){
	for (ll i=0; i<n; i++){
		for (ll j=0; j<n; j++){
			printf("%lld ", ma.ma[i][j]);
		}
		printf("\n");
	}
}

inline matrix fastPower(matrix a, ll k){
	matrix m = Ein();
	k--;
	while(k){
		if(k&1) m = m * a;
		a = a * a;
		k>>= 1;
	}
	return m;
}

inline matrix getFromInput(ll n){
	matrix a;
	for (ll i=0; i<n; i++){
		for (ll j=0; j<n; j++){
			ll e;
			scanf("%lld", &e);
			a.ma[i][j] = e;
		}
	}
	return a;
}

int main(){
	int n, k;
	scanf("%d %d", &n, &k);
	
	matrix m = getFromInput(n);
	matrix p = fastPower(m, k);
	printMatrix(p, n);
	return 0;
}

写成

inline matrix fastPower(matrix a, ll k){
	matrix m = Ein();
	while(k){
		if(k&1) m = m * a;
		a = a * a;
		k>>= 1;
	}
	return m;
}

也过了

2024/5/10 14:39
加载中...