標籤:style blog color get 2014 os
題目是要求建立一個方程組:
(mat[1][1]*x[1] + mat[1][2]*x[2] + … + mat[1][n]*x[n])%7 =mat[1][n+1]
(mat[2][1]*x[1] + mat[2][2]*x[2] + … + mat[2][n]*x[n])%7 =mat[2][n+1]
…
…
(mat[m][1]*x[1] + mat[m][2]*x[2] + … + mat[m][n]*x[n])%7 =mat[m][n+1]
如果有解輸出解得個數,如果無解Inconsistent data.無窮多組解Multiple solutions.
扯一句,什麼時候無解?
係數矩陣的秩 不等於 增廣矩陣的秩 時。反映在程式上就是:
for (i = row; i < N; i++)
{
if (a[i][M] != 0)
{
printf("Inconsistent data.\n");
}
}
什麼時候無窮多解?
當增廣矩陣的秩小於行列式的行數的時候。 反映在程式上就是:
if (row < M)
{
printf("Multiple solutions.\n");
}
好了,程式如下:
#include <cstdio>#include <cstring>#include <iostream>#include <cstdlib>using namespace std;int m,n;//n linesint M,N;int a[333][333];int times[333];int ans[333];int MOD=7;int getday(char* s){if(strcmp(s,"MON")==0) return 1;if(strcmp(s,"TUE")==0) return 2;if(strcmp(s,"WED")==0) return 3;if(strcmp(s,"THU")==0) return 4;if(strcmp(s,"FRI")==0) return 5;if(strcmp(s,"SAT")==0) return 6;if(strcmp(s,"SUN")==0) return 7;}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");}int main(){while(scanf("%d%d",&m,&n)!=EOF){if(m==0&&n==0)break;M=m,N=n;memset(a,0,sizeof(a));memset(times,0,sizeof(times));memset(ans,0,sizeof(ans));for(int i=0;i<n;i++){int prodnum;char str1[11],str2[11];scanf("%d%s%s",&prodnum,str1,str2);for(int j=0;j<prodnum;j++){int tmp;scanf("%d",&tmp);a[i][tmp-1]++;a[i][tmp-1]%=MOD;}a[i][m]=(getday(str2)-getday(str1)+1+MOD)%MOD;}Guass();}return 0;}