有些题你写多了或许就不觉得麻烦了,但是这题是我三天前拖欠的,一直不敢写..ε=唉,我对于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还是要有勇气ε唉~

京公网安备 11010502036488号