现场丢人——接近一页的WA

P4783 【模板】矩阵求逆

```cpp #include <iostream> #include <cstdio> #include <cctype> using namespace std; #define lli long long int lli mod = 1e9 + 7; template<typename T_>inline T_ getnum() { T_ res=0; bool flag=false; char ch=getchar(); while (!isdigit(ch)) { flag=flag?flag:ch=='-'; ch=getchar(); } while (isdigit(ch)) { res=(res<<1)+(res<<3)+ch-'0'; ch=getchar(); } return flag?-res:res; } template<typename T_>inline void putnum(T_ num) { if (num<0)putchar('-'),num=-num; if (num>9)putnum<T_>(num/10); putchar('0'+num%10); } struct matrix{ lli data[401][401]; matrix(int n){ for (register int i=1;i<=n;i++) for (register int j=1;j<=n;j++) data[i][j]=0; } inline void add_line(int n,int line,lli num) { for (register int i=1;i<=n;i++) { this->data[line][i]=((this->data[line][i]+num)+mod)%mod; } } inline void mul_line(int n,int line,lli k) { for (register int i=1;i<=n;i++) this->data[line][i]=(this->data[line][i]*k+mod)%mod; } inline void swap_line(int n,int line1,int line2) { for (register int i=1;i<=n;i++) swap(this->data[line1][i],this->data[line2][i]); } inline void add_mul(int n,int line1,int line2,lli k) { for (register int i=1;i<=n;i++) this->data[line1][i]=((this->data[line1][i]+k*this->data[line2][i]%mod)+mod)%mod; } inline void Init(int n) { for (register int i=1;i<=n;i++) for (register int j=1;j<=n;j++) this->data[i][j]=getnum<lli>(); } inline void print(int n) { for (register int i=1;i<=n;putchar('\n'),i++) for (register int j=1;j<=n;putchar(' '),j++) putnum<lli>(this->data[i][j]); } }; lli quick_pow(lli a,lli b = mod - 2) { if (b==0)return 1; else if (a==1)return 1; else { lli res=1; while (b) { if (b&1)res=res*a%mod; a=a*a%mod; b>>=1; } return res; } } int main() { lli n=getnum<lli>(); matrix a(n),b(n); a.Init(n); for (register int i=1;i<=n;i++) b.data[i][i]=1; for (register int i=1;i<=n;i++) { if (!a.data[i][i]) { for (register int j=i+1;j<=n;j++) if (a.data[j][i]) { a.swap_line(n,j,i); b.swap_line(n,j,i); break; } } if (!a.data[i][i]) { cout<<"No Solution"<<endl; return 0; } a.mul_line(n,i,quick_pow(a.data[i][i])); b.mul_line(n,i,quick_pow(a.data[i][i])); for (register int j=i+1;j<=n;j++) { b.add_line(n,j,-a.data[j][i]); a.add_line(n,j,-a.data[j][i]); } } for (register int i=n-1;i>=1;i--) { for (register int j=i+1;j<=n;j++) b.add_mul(n,i,j,-a.data[i][j]),a.add_mul(n,i,j,-a.data[i][j]); } b.print(n); return 0; } ``` 感觉没毛病啊...摸不着头脑
by Jelly_Goat @ 2019-04-11 17:54:34


你还没调出来啊
by ThomasX @ 2019-04-11 18:08:15


~~**您看看我交PR的时候刷了4页,谁更丢人**~~
by Piwry @ 2020-01-13 10:29:35


|