「POJ2947」Widget Factory
高斯消元模板
需要判断无解和多解
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cmath> 5 #define db double 6 using namespace std; 7 const int N=310,mod=7; 8 int n,m,inv[10]; 9 int mat[N][N]; 10 inline int getday(char *s){ 11 if(s[0]=='M') return 1; 12 if(s[0]=='T') return s[1]=='U'?2:4; 13 if(s[0]=='W') return 3; 14 if(s[0]=='F') return 5; 15 if(s[0]=='S') return s[1]=='A'?6:0; 16 } 17 inline int gauss(){ //无解返回0,多解返回-1,唯一解返回1 18 int now=1,nxt; 19 for(int i=1;i<=n;i++){ 20 nxt=-1; 21 for(int j=now;j<=m;j++) if(mat[j][i]){nxt=j;break;} 22 if(nxt==-1) continue; 23 if(nxt!=now) for(int j=i;j<=n+1;j++) swap(mat[now][j],mat[nxt][j]); 24 for(int j=now+1;j<=m;j++){ 25 int temp=mat[j][i]*inv[mat[now][i]]%mod; 26 for(int k=i;k<=n+1;k++) mat[j][k]=((mat[j][k]-temp*mat[now][k])%mod+mod)%mod; 27 } 28 now++; 29 } 30 for(int i=1;i<=m;i++)if(mat[i][n+1]){ 31 bool flag=1; 32 for(int j=1;j<=n;j++) if(mat[i][j]){flag=0;break;} 33 if(flag) return 0; 34 } 35 if(now<=n) return -1; 36 for(int i=n;i>=1;i--){ 37 mat[i][n+1]=mat[i][n+1]*inv[mat[i][i]]%mod; 38 for(int j=1;j<=i-1;j++) mat[j][n+1]=((mat[j][n+1]-mat[j][i]*mat[i][n+1])%mod+mod)%mod; 39 if(mat[i][n+1]<3) mat[i][n+1]+=mod; 40 } 41 return 1; 42 } 43 void solve(){ 44 if(!n) exit(0); 45 int t1,k; 46 char s1[10],s2[10]; 47 for(int i=1;i<=m;i++){ 48 scanf("%d%s%s",&k,s1,s2); 49 mat[i][n+1]=(getday(s2)-getday(s1)+8)%7; 50 for(int j=1;j<=k;j++) scanf("%d",&t1),mat[i][t1]+=1; 51 for(int j=1;j<=n;j++) mat[i][j]%=mod; 52 } 53 int x=gauss(); 54 if(!x) printf("Inconsistent data.\n"); 55 else if(x==-1) printf("Multiple solutions.\n"); 56 else{ 57 for(int i=1;i<n;i++) printf("%d ",mat[i][n+1]); 58 printf("%d\n",mat[n][n+1]); 59 } 60 memset(mat,0,sizeof(mat)); 61 return; 62 } 63 int main(){ 64 for(int i=1;i<7;i++) inv[i]=int(pow(1.0*i,5))%7; 65 while(scanf("%d%d",&n,&m)) solve(); 66 return 0; 67 }