P3390 -> 100分AC每个点基本上都在700~900ms徘徊
查看原帖
P3390 -> 100分AC每个点基本上都在700~900ms徘徊
308107
Xu__楼主2021/5/1 19:45

在洛谷上测试还好一些,但是去其他数据强一些的OJ测试基本都在超时边缘徘徊,求大佬解释?

#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
const long long N = 105;
long long l, qow, mod = 1e9+7;

struct matrix{
	long long n, m, z[N][N];
	
	matrix()
	{
		n = m = 0;
		for (int i = 1; i < N; i++)
			for (int j = 1; j < N;j++)
				z[i][j] = 0;
	}
	
	void input_c(){
		n = m = l;
		for(long long i = 1; i <= n; i++)
			for(long long j = 1; j <= m; j++)
				scanf("%lld",&z[i][j]);
	}
	
	void input_s(){
		n = m = l;
		for(long long i = 1;i <= n; i++)	z[i][i] = 1;
	}
	
	void output(){
		for(long long i = 1; i <= n; i++){
			for(long long j = 1; j <= m; j++)
				printf("%lld ",z[i][j]);
			printf("\n");
		}
	}
	
}a;

matrix operator*(const matrix &a, const matrix &b){
	matrix c;
	c.n = c.m = l;
	for(long long i = 1; i <= c.n; i++)
		for(long long j = 1; j <= c.m; j++)
			for(long long k = 1; k <= a.m; k++)
				c.z[i][j] = (c.z[i][j] + a.z[i][k] * b.z[k][j]) % mod;
	return c;
}

matrix Qpower(matrix a, long long k){
	matrix ans;
	ans.m = ans.n = a.n; 
	ans.input_s();
	while(k > 0){
		if(k & 1)	ans = ans * a;
		a = a * a;
		k >>= 1;
	}
	return ans;
}

int main(){
	scanf("%lld%lld",&l,&qow);
	a.input_c();
	matrix b = Qpower(a, qow);
	b.output();
	return 0;
}
2021/5/1 19:45
加载中...