http://poj.org/problem?id=2947
基础高斯消元 注意时刻模7
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<map> #include<cmath> #define LL long long using namespace std; const int N=350; int a[N][N]; int ans[N]; int n,m; char s[9][5]={"","MON","TUE","WED","THU","FRI","SAT","SUN"}; int Date(char stemp[]) { for(int i=1;i<=7;++i) { if(strcmp(stemp,s[i])==0) return i; } return 0; } int findans(int x,int y) { x=(x%7+7)%7; y=(y%7+7)%7; for(int i=3;i<=9;++i) { if(x*i%7==y) return i; } } void Gauss() { int row=1; int col=1; while(row<=m&&col<=n) { int k=0; for(int i=row;i<=m;++i) if(a[i][col]!=0) {k=i;break;} if(k==0)//如果一列全为0 则列加一 {++col;continue;} if(k!=row)//如果此行最前是0 则和不是0 的那一行交换 for(int j=col;j<=n+1;++j) swap(a[row][j],a[k][j]); int x=a[row][col]; for(int i=row+1;i<=m;i++)//把余下行的最前元素变成0 { int y=a[i][col]; for(int j=col;j<=n+1;++j) { a[i][j]=(a[i][j]*x-y*a[row][j])%7; } } ++row;++col; }//这样最好形成的是右上三角 for(int i=row;i<=m;++i) { if(a[i][n+1]!=0)//如果这样无解 { printf("Inconsistent data.\n"); return ; } } if(row!=col||row-1<n||col<=n)//row!=col 说明有一列全为0的状况 row-1<n说明A的秩小于n col<=n 说明列太长 { printf("Multiple solutions.\n"); return ; } for(int i=row-1;i>=1;--i) { int sum=0; for(int j=i+1;j<=n;++j) sum+=a[i][j]*ans[j]; ans[i]=findans(a[i][i],a[i][n+1]-sum); } for(int i=1;i<=n;++i) { printf("%d",ans[i]); if(i==n) printf("\n"); else printf(" "); } } int main() { while(scanf("%d %d",&n,&m)!=EOF) { if(n==0&&m==0) break; memset(a,0,sizeof(a)); int x; char d1[5],d2[5]; for(int i=1;i<=m;++i) { scanf("%d %s %s",&x,d1,d2); //printf("%s %s\n",d1,d2); a[i][n+1]=Date(d2)-Date(d1)+1; while(x--) { int k; scanf("%d",&k); ++a[i][k]; } for(int j=1;j<=n+1;++j) { a[i][j]%=7; } } Gauss(); } return 0; }