有些题你写多了或许就不觉得麻烦了,但是这题是我三天前拖欠的,一直不敢写..ε=唉,我对于100+的纯代码都有一种莫名的恐惧感.其实每个题也就那么几个过程.
这题是用高斯消元解异或同余方程.并没有重点要讲的地方.
代码如下:
#include <bits/stdc++.h> using namespace std; const int N=305; const int mod=7; int a[N][N]; string s[7]={"MON","TUE","WED","THU","FRI","SAT","SUN"}; inline int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } inline int lcm(int a,int b) { return a/gcd(a,b)*b; } inline int gauss(int n,int m) { int l,r; for(l=0,r=0;l<n;l++) { int pos=r; for(int i=r+1;i<m;i++) { if(a[i][l]>a[pos][l]) { pos=i; } } for(int i=l;i<=n;i++) swap(a[pos][i],a[r][i]); if(a[r][l]==0) {continue;} for(int i=r+1;i<m;i++) { if(a[i][l]!=0) { int ta=lcm(a[r][l],a[i][l]); int tb=ta/a[r][l]; int tc=ta/a[i][l]; for(int j=l;j<=n;j++) { a[i][j]=((tc*a[i][j]-tb*a[r][j])%mod+mod)%mod; } } } r++; } //无解 for(int i=r;i<m;i++) { if(a[i][n]!=0) return 0; } //无数解 if(r<n) { return 1; } else { for(int i=n-1;i>=0;i--) { for(int j=i+1;j<n;j++) { a[i][n]-=a[i][j]*a[j][n]; a[i][n]=(a[i][n]%mod+mod)%mod; } while(a[i][n]%a[i][i]!=0) a[i][n]+=mod; a[i][n]/=a[i][i]; } return 2; } } int main() { int n,m;//n个未知数,m个方程. while(cin>>n>>m) { memset(a,0,sizeof a); if(n==0&&m==0) break; for(int i=0;i<m;i++) { int k;string b,c; cin>>k>>b>>c; while(k--) { int x; scanf("%d",&x); a[i][x-1]++; if(a[i][x-1]>=mod) a[i][x-1]%=mod; } int aa,ab; for(int i=0;i<7;i++) { if(s[i]==b) aa=i; if(s[i]==c) ab=i; } a[i][n]=((ab-aa+1)%mod+mod)%mod; } int t=gauss(n,m); if(t==0) { puts("Inconsistent data."); }//无解 else if(t==1) { puts("Multiple solutions."); }//无数解 else { for(int i=0;i<n;i++) {if(a[i][n]<3) a[i][n]+=7;printf("%d ",a[i][n]);} printf("\n"); }//唯一解 } return 0; }
自己debug还是要有勇气ε唉~