@[您太强了](/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