「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.
");
55     else if(x==-1) printf("Multiple solutions.
");
56     else{
57         for(int i=1;i<n;i++) printf("%d ",mat[i][n+1]);
58         printf("%d
",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 }
原文地址:https://www.cnblogs.com/mycups/p/8527911.html