根据样例列出来方程,解出来结果是1,3,实际结果是8,3。。懵逼了,一周最多七天,怎么会有8。搜了下题解才知道这中间可能隔着很多周,那这就是用高斯消元解线性同余方程组了,而且方程很好列,把kuangbin大佬板子拿来就是了。(板子就是这道题)
具体意思看这里:http://blog.csdn.net/qingshui23/article/details/52511894
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int mod = 7;
const int MAXN = 400;
int a[MAXN][MAXN];
int x[MAXN];
int gcd(int a, int b)
{
if(b == 0) return a;
return gcd(b,a%b);
}
int lcm(int a, int b)
{
return a/gcd(a,b)*b;
}
long long inv(long long a, long long m)
{
if(a == 1) return 1;
return inv(m%a,a)*(m-m/a)%m;
}
int change(char* s)
{
if(strcmp(s,"MON") == 0) return 1;
else if(strcmp(s,"TUE")==0) return 2;
else if(strcmp(s,"WED")==0) return 3;
else if(strcmp(s,"THU")==0) return 4;
else if(strcmp(s,"FRI")==0) return 5;
else if(strcmp(s,"SAT")==0) return 6;
else return 7;
}
//equ行,var列
int Gauss(int equ, int var)
{
int maxR,col,k;
for(k = 0, col = 0; k < equ && col < var; ++k,++col)
{
maxR = k;
for(int i = k+1; i < equ; ++i)
if(abs(a[i][col]) > abs(a[maxR][col]))
maxR = i;
if(a[maxR][col] == 0)
{
k--;
continue;
}
if(maxR != k)
for(int j = col; j < var+1; ++j)
swap(a[k][j],a[maxR][j]);
for(int i = k+1; i < equ; ++i)
{
if(a[i][col] != 0)
{
int LCM = lcm(abs(a[i][col]),abs(a[k][col]));
int ta = LCM/abs(a[i][col]);
int tb = LCM/abs(a[k][col]);
if(a[i][col]*a[k][col] < 0) tb = -tb;
for(int j = col; j < var+1; ++j)
a[i][j] = ((a[i][j]*ta-a[k][j]*tb)%mod+mod)%mod;
}
}
}
for(int i = k; i < equ; ++i)
if(a[i][col] != 0)
return -1;
if(k < var) return var-k;
for(int i = var-1; i >= 0; --i)
{
int temp = a[i][var];
for(int j = i+1; j < var; ++j)
{
if(a[i][j] != 0)
{
temp -= a[i][j]*x[j];
temp = (temp%mod+mod)%mod;
}
}
x[i] = (temp*inv(a[i][i],mod))%mod;
}
return 0;
}
int main()
{
int n,m;
while(scanf("%d %d",&n,&m) && n+m)
{
memset(a,0,sizeof(a));
char str1[10],str2[10];
int k;
for(int i = 0; i < m; ++i)
{
scanf("%d %s %s",&k,str1,str2);
a[i][n] = ((change(str2)-change(str1)+1)%mod+mod)%mod;
int t;
while(k--)
{
scanf("%d",&t);
t--;
a[i][t]++;
a[i][t] %= mod;
}
}
int res = Gauss(m,n);
if(res == 0)
{
for(int i = 0; i < n; ++i)
if(x[i] <= 2)
x[i] += 7;
for(int i = 0; i < n-1; ++i)
printf("%d ",x[i]);
printf("%d\n",x[n-1]);
}
else if(res == -1) printf("Inconsistent data.\n");
else printf("Multiple solutions.\n");
}
return 0;
}