1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<cstdlib> 7 #define LL long long 8 using namespace std; 9 LL mod; 10 LL a[410][410]; 11 int n,is[410],js[410]; 12 void exgcd(int a,int b,int &x,int &y){ 13 if(!b)return x=1,y=0,void(); 14 exgcd(b,a%b,y,x);y-=x*(a/b); 15 } 16 int inv(int p){ 17 int x,y;exgcd(p,mod,x,y); 18 return (x+mod)%mod; 19 } 20 void inv(){ 21 for(int k=1;k<=n;k++){ 22 for(int i=k;i<=n;i++) 23 for(int j=k;j<=n;j++)if(a[i][j]){ 24 is[k]=i,js[k]=j;break; 25 } 26 for(int i=1;i<=n;i++) 27 swap(a[k][i],a[is[k]][i]); 28 for(int i=1;i<=n;i++) 29 swap(a[i][k],a[i][js[k]]); 30 if(!a[k][k]){ 31 puts("No Solution"); 32 exit(0); 33 } 34 a[k][k]=inv(a[k][k]); 35 for(int j=1;j<=n;j++)if(j!=k) 36 (a[k][j]*=a[k][k])%=mod; 37 for(int i=1;i<=n;i++)if(i!=k) 38 for(int j=1;j<=n;j++)if(j!=k) 39 (a[i][j]+=mod-a[i][k]*a[k][j]%mod)%=mod; 40 for(int i=1;i<=n;i++)if(i!=k) 41 a[i][k]=(mod-a[i][k]*a[k][k]%mod)%mod; 42 } 43 for(int k=n;k;k--){ 44 for(int i=1;i<=n;i++) 45 swap(a[js[k]][i],a[k][i]); 46 for(int i=1;i<=n;i++) 47 swap(a[i][is[k]],a[i][k]); 48 } 49 } 50 int main(){ 51 //freopen("a.in","r",stdin); 52 //freopen("a.out","w",stdout); 53 scanf("%d%d",&n,&mod); 54 for(int i=1;i<=n;i++) 55 for(int j=1;j<=n;j++) 56 scanf("%lld",a[i]+j); 57 inv(); 58 for(int i=1;i<=n;i++) 59 for(int j=1;j<=n;j++) 60 printf("%lld%c",a[i][j],j==n?' ':' '); 61 return 0; 62 }
第一题板子题,就是把模数1e9+7改成了输入的数
zhx大佬:这道题如果你没有做过矩阵求逆的话是最简单的(虽然我连样例都差点没看懂