TLE7个点,救救孩子qwq

P4783 【模板】矩阵求逆

@[您太强了](/space/show?uid=107620) ~~[您太强了](/space/show?uid=107620)~~ 显然,矩阵用memset初始化很慢
by CeLaMbDa @ 2019-08-20 09:01:44


@[CeLaMbDa](/space/show?uid=109226) 改用for还是很慢,依旧TLE7个点qwq ```cpp struct matrix { int z[455][855]; matrix() { for(int i=1;i<=n;i++) for(int j=1;j<=2*n;j++) z[i][j]=0; } }m; ```
by 我太强了 @ 2019-08-20 09:09:46


~~开O2......~~
by 已注销HeBhs37KwrDer @ 2019-08-20 09:17:45


@[Hopjac—Programmer](/space/show?uid=168334) 开O2之后也是tle7个点
by 我太强了 @ 2019-08-20 10:28:33


@[您太强了](/space/show?uid=107620) ~~我是蒟蒻...告辞~~ ε=ε=ε=ε=ε=┌(; ̄◇ ̄)┘
by 已注销HeBhs37KwrDer @ 2019-08-20 10:39:37


```cpp #pragma GCC optimize("Ofast,fast-math,unroll-loops") ```
by saxiy @ 2019-08-27 08:54:10


@[您太强了](/space/show?uid=107620) 别用快写,意义不大,一直%%%还可能负优化
by saxiy @ 2019-08-27 08:55:26


而且这个递归快写还不能inline。。
by saxiy @ 2019-08-27 08:56:24


@[您太强了](/space/show?uid=107620) 改了一下T了5个点 推荐重构,常数小不小靠的是个人习惯 ```cpp #pragma GCC optimize("Ofast,fast-math,unroll-loops") #include<cstdio> #include<cstring> #include<algorithm> #define int long long int n,p=1e9+7,flag; inline int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return f ? x : -x; } struct matrix { int z[455][855]; matrix() { memset(z,0,sizeof(z)); } }m; int inv(int a) { int up=1e9+5,base=a,ret=1; while(up) { if(up&1) ret=ret*base%p; base=base*base%p; up>>=1; } return ret; } void gauss() { for(register int i=1;i<=n;i++) { if(m.z[i][i]==0) for(register int j=i+1;j<=n;j++) if(m.z[j][i]!=0) //交换行 { for(register int k=1;k<=n<<1;k++) std::swap(m.z[i][k],m.z[j][k]); break; } if(!m.z[i][i]) { flag=1; return; } int mul=inv(m.z[i][i]); //修改此行 for(register int j=1;j<=n<<1;j++) m.z[i][j]=(m.z[i][j]*mul)%p; for(register int j=i+1;j<=n;j++) { //修改下面的行 mul=m.z[j][i]; for(register int k=1;k<=n<<1;k++) { m.z[j][k]-=(m.z[i][k]*mul)%p; if(m.z[j][k]<0) m.z[j][k]+=p; } } } } void ssuag() { int mul; for(register int i=n-1;i>=1;i--) for(register int j=i+1;j<=n;j++) { mul=m.z[i][j]; for(register int k=1;k<=n<<1;k++) { m.z[i][k] -= m.z[j][k] * mul % p; if(m.z[i][k] < 0) m.z[i][k]+=p; } } } signed main() { n = read(); for(register int i=1;i<=n;i++) for(register int j=1;j<=n;j++) m.z[i][j]=read(); for(register int i=1;i<=n;i++) m.z[i][n+i]=1; gauss();//消成上三角矩阵 if(flag) { puts("No Solution"); return 0; } ssuag();//消成单位矩阵 for(register int i=1;i<=n;i++) { for(register int j=1;j<=n;j++) printf("%lld ", m.z[i][j+n]); putchar('\n'); } return 0; } ```
by saxiy @ 2019-08-27 09:08:06


|