POJ 2947 2947 Widget Factory 高斯消元
给出组件的数量n,给出记录的数量m(n就是变元数量,m是方程数量)。每一个记录代表一个方程,求每个组件的生产天数。
高斯消元即可
#include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <string> using namespace std; const int MOD = 7; const int MAXN = 310; int a[MAXN][MAXN], x[MAXN]; void debug(int n, int m) { for(int i=0; i<n; i++) { for(int j=0; j<m; j++) printf("%d ", a[i][j]); printf(" %d\n", a[i][m]); } puts("**************************************************************"); } int gcd(int a,int b) //递归算法 { return b ? gcd(b, a%b) : a; } int lcm(int a, int b) { return a*b/gcd(a,b); } int Guass(int equ,int var) { // debug(equ, var); int row,col; row=col=0; while(row<equ && col<var) { //列非零主 int r=row; for(int i=row; i<equ; i++) if(a[i][col]!=0) { r=i; break; } if(r!=row) { for(int j=col; j<var+1; j++) swap(a[row][j],a[r][j]); } if(a[row][col]==0)//说明有自由变元 { col++; continue; } //消元 for(int i=row+1; i<equ; i++) { if(a[i][col]==0) continue; int l = lcm(a[row][col],a[i][col]); int ta = l/a[row][col]; int tb = l/a[i][col]; for(int j=col; j<var+1; j++) a[i][j] = ((tb*a[i][j] - ta*a[row][j]) % MOD + MOD) %MOD; } // debug(equ, var); row++; col++; } for(int i=row; i<equ; i++) if(a[i][var]!=0) return -1; if(row < var) return 1; for(int i=row-1; i>=0; i--) { int tmp = a[i][var]; for(int j=i+1; j<var; j++) tmp = ((tmp - x[j]*a[i][j])%MOD + MOD)%MOD; while(tmp%a[i][i]) tmp += MOD; x[i] = tmp/a[i][i]%MOD; } return 0; } int main() { // freopen("in.txt", "r", stdin); int n,m; map<string, int>mp; mp["MON"] = 1, mp["TUE"] = 2, mp["WED"] = 3; mp["THU"] = 4, mp["FRI"] = 5, mp["SAT"] = 6, mp["SUN"] = 7; while(~scanf("%d%d", &n, &m)) //n个变元,m个方程 { memset(a, 0, sizeof(a)); if(n == 0 && m == 0) break; for(int i=0; i<m; i++) { int k; char s1[5], s2[5]; scanf("%d", &k); scanf("%s%s", s1, s2); a[i][n] = (mp[s2]-mp[s1]+1+MOD)%MOD; while(k--) { int t; scanf("%d", &t); a[i][t-1]++; a[i][t-1] %= MOD; } } int res = Guass(m, n); if(res == -1) puts("Inconsistent data."); else if(res == 1) puts("Multiple solutions."); else { for(int i=0; i<n; i++) if(x[i]<3) x[i] += MOD; for(int i=0; i<n; i++) printf("%d%c", x[i], i==n-1?'\n':' '); } } return 0; }