int gcd(int a,int b) { return b==0?a:gcd(b,a%b); }
int lcm(int a,int b) { return a/gcd(a,b)*b; }
int a[maxn][maxn],x[maxn];
int equ,var;
int Gauss()
{
int i,j,k,max_r,col;
int LCM,tmp,ta,tb;
for(i=0;i<=var;i++) x[i]=0;
for(k=0,col=0;k<equ&&col<var;k++,col++)
{
max_r=k;
for(i=k+1;i<equ;i++) if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;
if(a[max_r][col]==0) { k--; continue; }
if(max_r!=k) for(j=k;j<=var;j++) swap(a[max_r][j],a[k][j]);
for(i=k+1;i<equ;i++)
{
if(a[i][col])
{
LCM=lcm(abs(a[i][col]),abs(a[k][col]));
ta=LCM/abs(a[i][col]);
tb=LCM/abs(a[k][col]);
if(a[i][col]*a[k][col]<0) tb=-tb;
for(j=col;j<=var;j++) a[i][j]=((a[i][j]*ta-a[k][j]*tb)%7+7)%7;
}
}
}
for(i=k;i<equ;i++) if(a[i][col]) return -1;
if(k<var) return var-k;
for(i=var-1;i>=0;i--)
{
tmp=a[i][var];
for(j=i+1;j<var;j++)
{
if(a[i][j]) tmp-=a[i][j]*x[j];
tmp=(tmp%7+7)%7;
}
while(tmp%a[i][i]) tmp+=7;
x[i]=(tmp/a[i][i])%7;
}
return 0;
}
高斯消元借模线性同余方程
最新推荐文章于 2022-08-22 22:42:02 发布