代码及注释:
#define MOD 7
int a[310][310];//a[i][j]表示第i个等式第j个变量前的系数,i、j均从0开始
int ans[310];//答案
int extend_gcd(int A, int B, int &x, int &y)
{
if (B == 0)
{
x = 1, y = 0;
return A;
}
else
{
int r = extend_gcd(B, A%B, x, y);
int t = x;
x = y;
y = t - A / B*y;
return r;
}
}
int lcm(int A, int B)
{
int x = 0, y = 0;
return A*B / extend_gcd(A, B, x, y);
}
void Guass()
{
int i, j, row, col;
for (row = 0, col = 0; row < N && col < M; row++, col++)
{
for (i = row; i < N; i++)
if (a[i][col])
break;
if (i == N)
{
row--;
continue;
}
if (i != row)
for (j = 0; j <= M; j++)
swap(a[row][j], a[i][j]);
for (i = row + 1; i < N; i++)
if (a[i][col])
{
int LCM = lcm(a[row][col], a[i][col]);//利用最小公倍数去化上三角
int ch1 = LCM / a[row][col], ch2 = LCM / a[i][col];
for (j = col; j <= M; j++)
a[i][j] = ((a[i][j] * ch2 - a[row][j] * ch1)%MOD + MOD)%MOD;
}
}
for (i = row; i < N; i++)//无解
if (a[i][M] != 0)
{
printf("Inconsistent data.\n");
return;
}
if (row < M)//无穷多解
{
printf("Multiple solutions.\n");
return;
}
for (i = M - 1; i >= 0; i--)//唯一解时
{
int ch = 0;
for (j = i + 1; j < M; j++)
ch = (ch + ans[j] * a[i][j] % MOD)%MOD;
int last = ((a[i][M] - ch)%MOD + MOD)%MOD;
int x = 0, y = 0;
int d = extend_gcd(a[i][i], MOD, x, y);
x %= MOD;
if (x < 0) x += MOD;
ans[i] = last*x / d%MOD;
if (ans[i] < 3) ans[i] += 7;
}
for (int i = 0; i < M; i++)
if (i == 0)
printf("%d", ans[i]);
else
printf(" %d", ans[i]);
printf("\n");
}