警钟撅烂(如果你TLE)
查看原帖
警钟撅烂(如果你TLE)
1236247
Da_Vinci楼主2024/6/16 20:54

第一次提交,惨遭TLE

1.不要用long long

45989*45989=2114988121<2147483647,不会爆int,反而开long long会常数变大见祖宗

使用int,快了一点但是不多

2.改变循环顺序

矩阵乘法的复杂度高达O(n^3),是本题代码耗费时间最长的部分,考虑对其进行优化。

优化前(TLE)

for(int i=0;i<=sz;i++){
	for(int j=0;j<=sz;j++){
		for(int k=0;k<=sz;k++)
       		 res.a[i][j]=(res.a[i][j]%mod+a.a[i][k]*b.a[k][j]%mod)%mod;
	}	
}

优化后(AC)

for(register int i=0;i<=sz;i++){
	for(register int k=0;k<=sz;k++){
		for(register int j=0;j<=sz;j++)
   	   	res.a[i][j]=(res.a[i][j]%mod+a.a[i][k]*b.a[k][j]%mod)%mod;
		}	
	}

register作用不大,因为他已经在c++11或以后的版本中无效。

真正起到作用的是循环顺序的改变,这样可以让CPU的缓存更好的发挥作用,不然CPU要频繁进行内存操作导致速度减缓。 AC记录

2024/6/16 20:54
加载中...