题目连接~~~
本题是对同余方程组消元,方程比较好列,本题可以列m个方程,每个方程可以列成k1*x1 + k2*x2……kn*xn = y1 (mod 7)
y1是加工这一批零件所需要的时间。然后解方程就可以了。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <ctime> #include <algorithm> using namespace std ; #define INF 0x3f3f3f3f const double esp = 0.00000001 ; const int MX = 300 + 10 ; const int MY = 100 + 10 ; int g[MX][MX] ,ans[MX] ; int Solve(char s[]){ int f_num = 0 ; if(strcmp(s ,"MON") == 0) f_num = 1 ; else if(strcmp(s ,"TUE") == 0) f_num = 2 ; else if(strcmp(s ,"WED") == 0) f_num = 3 ; else if(strcmp(s ,"THU") == 0) f_num = 4 ; else if(strcmp(s ,"FRI") == 0) f_num = 5 ; else if(strcmp(s ,"SAT") == 0) f_num = 6 ; else if(strcmp(s ,"SUN") == 0) f_num = 7 ; return f_num ; } int Gcd(int a ,int b){ int tmp ; while(b){ tmp = a ; a = b ; b = tmp % b ; } return a ; } int Lcm(int a ,int b){ return a/Gcd(a ,b)*b ; } int Gauss(int n ,int m ,int g[][MX] ,int mod){//n行 m列 int max_r ; int k = 0 ,col = 0 ; for( ;k < n && col < m ; ++k ,++col){ max_r = k ; for(int i = k+1 ;i < n ; ++i) if(abs(g[max_r][col]) < abs(g[i][col])) max_r = i ; if(!g[max_r][col]){ k-- ; continue ; } if(max_r != k){ for(int i = col ;i <= m ; ++i) swap(g[k][i] ,g[max_r][i]) ; } for(int i = k + 1 ;i < n ; ++i){ if(g[i][col]){ int LCM = Lcm(abs(g[k][col]) ,abs(g[i][col])) ; int ta = LCM/abs(g[i][col]) ; int tb = LCM/abs(g[k][col]) ; if(g[i][col] * g[k][col] < 0) tb = -tb ; for(int j = col ;j <= m ; ++j) g[i][j] = ((g[i][j]*ta - g[k][j]*tb)%mod +mod)%mod ; } } } for(int i = k ;i < n ; ++i) if(g[i][col]) return -1 ; if(k < m) return m-k ; for(int i = n-1 ;i >= 0 ; --i){ int tmp = g[i][m] ; for(int j = i+1 ;j < m ; ++j){ tmp -= g[i][j]*ans[j] ; tmp = (tmp%mod + mod)%mod ; } int sum ; for(int t = 3 ;t <= 9 ; ++t){ sum = ((g[i][i]*t)%mod + mod)%mod ; if(sum == tmp){ ans[i] = t ; break ; } } } return 0 ; } int main(){ //freopen("input.txt" ,"r" ,stdin) ; char s1[MX] ,s2[MX] ; int n ,m ,mod = 7 ,num ,tmp ; while(~scanf("%d%d" ,&n ,&m)){ if(!n && !m) break ; memset(g ,0 ,sizeof(g)) ; for(int i = 0 ;i < m ; ++i){ scanf("%d%s%s" ,&num ,s1 ,s2) ; int d1 = Solve(s1) ; int d2 = Solve(s2) ; g[i][n] = ((d2 - d1 + mod)%mod + 1)%mod ; for(int j = 0 ;j < num ; ++j){ scanf("%d" ,&tmp) ; g[i][tmp-1] = (g[i][tmp-1]+1)%mod ; } } memset(ans ,0 ,sizeof(ans)) ; int f_num = Gauss(m ,n ,g ,mod) ; if(!f_num) { for(int i = 0 ;i < n ; ++i) if(!i) printf("%d" ,ans[i]) ; else printf(" %d" ,ans[i]) ; puts("") ; } else if(f_num == -1) puts("Inconsistent data.") ; else puts("Multiple solutions.") ; } return 0 ; }