WA求查
查看原帖
WA求查
1295409
akahoshi楼主2024/5/10 14:07

样例过了 有格式输出 之前幂的时候

c.ma[i][j] = mod(mod(c.ma[i][j]) + mod(a.ma[i][k] * b.ma[k][j]));

也不行

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

using namespace std;
typedef long long ll;

const int modn = 10;
const int N = 40+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 (short i=0; i<N; i++){
		for (short j=0; j<N; j++){
			for (short k=0; k<N; k++){
				c.ma[i][j] = c.ma[i][j] + a.ma[i][k] * b.ma[k][j];
			}
		}
	}
	return c;
}

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

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

inline void printMatrix(matrix ma, short n){
	for (short i=0; i<n; i++){
		for (short j=0; j<n; j++){
			if (j!=0) printf(" ");
			printf("%d", mod(ma.ma[i][j]));
		}
		printf("\n");
	}
}

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

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

inline matrix sigmaMatrixPower(matrix a, int k){
	matrix S[2][2];
	int l = 2;
	S[0][0] = S[1][0] = a;
	S[0][1] = matrix();
	S[1][1] = Ein();
	matrix m[2][2];
	m[0][0] = m[1][1] = Ein();
	while(k){
		if(k&1){
			matrix a[2][2];
			// m = m * S
			a[0][0] = m[0][0] * S[0][0] + m[0][1] * S[1][0];
			a[0][1] = m[0][0] * S[0][1] + m[0][1] * S[1][1];
			a[1][0] = m[1][0] * S[0][0] + m[1][1] * S[1][0];
			a[1][1] = m[1][0] * S[0][1] + m[1][1] * S[1][1];
			swap(m, a);
		}
		matrix a[2][2];
		// S = S * S
		a[0][0] = S[0][0] * S[0][0] + S[0][1] * S[1][0];
		a[0][1] = S[0][0] * S[0][1] + S[0][1] * S[1][1];
		a[1][0] = S[1][0] * S[0][0] + S[1][1] * S[1][0];
		a[1][1] = S[1][0] * S[0][1] + S[1][1] * S[1][1];
		swap(S, a);
		k >>= 1;
	}
	return S[1][0];
}

void calc(int n, int k){
	matrix m = getFromInput(n);
	matrix s = sigmaMatrixPower(m, k);
	printMatrix(s, n);
}

int main(){
	int n, k;
	while (true){
		scanf("%d %d", &n, &k);
		if (n==0) break;
		calc(n, k);
		printf(" \n");
	}
	return 0;
}
2024/5/10 14:07
加载中...