第一次提交,惨遭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记录