SCUT - 261 - 对称与反对称 - 构造 - 简单数论
https://scut.online/p/261
由于M不是质数,要用扩展欧几里得求逆元,而不是费马小定理!
由于M不是质数,要用扩展欧几里得求逆元,而不是费马小定理!
由于M不是质数,要用扩展欧几里得求逆元,而不是费马小定理!
最后小心逆元是负数的情况。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1010; int A[maxn][maxn],C[maxn][maxn],n,m; inline void ex_gcd(ll a,ll b,ll&x,ll&y,ll&d) { if(!b){d=a;x=1;y=0;return;} ex_gcd(b,a%b,y,x,d); y-=x*(a/b); return; } inline void solve() { ll inv,y,d;ex_gcd(2,m,inv,y,d); inv=(inv+m)%m; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ C[i][j]=(A[i][j]-A[j][i]+m)%m*inv%m; C[j][i]=(m-C[i][j])%m; } } return; } int main() { #ifdef local freopen("a.txt","r",stdin); #endif // local while(~scanf("%d%d",&n,&m)) { memset(C,0,sizeof(C)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&A[i][j]); A[i][j]%=m; } } if(m>1) solve(); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ printf("%d%c",C[i][j],j==n-1?'\n':' '); } } } return 0; }