通过和题解对拍得来的Hack数据:
7 11
11 THU THU
7 2 1 4 5 1 5 1 2 2 2
17 MON WED
2 6 3 5 3 2 5 3 2 2 7 7 6 7 2 6 6
15 SUN TUE
2 2 4 7 4 2 1 2 7 1 6 5 7 4 4
1 MON THU
6
3 THU THU
5 4 5
5 SUN FRI
2 2 1 3 5
1 FRI MON
4
20 SUN MON
4 6 3 7 2 5 1 2 6 2 4 7 1 2 7 7 6 3 5 5
6 WED SUN
2 2 2 4 6 1
7 THU SUN
2 1 3 3 4 3 6
1 FRI MON
3
我的输出:
5 4 8 4 6 9 3
题解的输出:
Inconsistent data.
代码:
#include<bits/stdc++.h>
#define sd std::
#define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define il inline
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define f(i,a,b) for(int i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define umap(x,y) sd unordered_map<x,y>
#define pque(x) sd priority_queue<x>
#define X first
#define Y second
#define kg putchar(' ')
#define Fr(a) for(auto it:a)
#define dbg(x) sd cout<<#x<<": "<<x<<sd endl
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
il void print(int x){if(x<0) putchar('-'),printt(-x);else printt(x);}
il void put(int x){print(x);putchar('\n');}
il void printk(int x){print(x);kg;}
const int N=310;
int n,m,k,x;
int a[N][N],ans[N];
umap(sd string,int) mp;
int ksm(int p,int q)
{
if(!q) return 1;
if(q&1) return p*ksm(p,q-1)%7;
int tmp=ksm(p,q/2)%7;
return tmp*tmp%7;
}
int ma;
void Guess()//高斯消元
{
F(i,1,n)
{
ma=i;
F(j,1,m)
{
if(a[j][j]&&j<i) continue;
if(abs(a[j][i])>abs(a[ma][i])) ma=j;
}
F(j,1,n+1) sd swap(a[i][j],a[ma][j]);
if(!a[i][i]) continue;
F(j,1,m)
{
if(i==j) continue;
int rate=a[j][i]*ksm(a[i][i],5)%7;
F(k,1,n+1) (a[j][k]-=a[i][k]*rate%7-7)%=7;
}
}
}
int flag;
sd string calc(int i)
{
F(j,3,9)
{
if((a[i][i]*j)%7==a[i][n+1])
{
if(ans[i])
{
// printf("第%lld个未知数有至少两个解,最小的两个解为%lld和%lld\n",i,ans[i],j);
return flag=1,"Multiple solutions.";//多解
}
ans[i]=j;
}
}
return ans[i]?"":(flag=1,"Inconsistent data.");//无解
}
il void init()
{
me(a,0);
}
sd string st,en;
il void solve()
{
init();
n=read(),m=read();
if(!(n&m)) exit(0);
F(i,1,m)
{
k=read();
sd cin>>st>>en;
F(j,1,k)
{
x=read();
a[i][x]=(a[i][x]+1)%7;
}
a[i][n+1]=(mp[en]-(mp[st]-1)+7)%7;
}
Guess();
// for(int i=1;i<=m;i++) dbg(a[i][i]),dbg(a[i][n+1]);
F(i,1,n) if(!a[i][i]&&a[i][n+1]) return puts("Inconsistent data."),void();//无解
F(i,1,n) if(!a[i][i]&&!a[i][n+1]) return puts("Multiple solutions."),void();//多解
F(i,1,n)
{
sd cout<<calc(i);
if(flag) return puts(""),void();
}
F(i,1,n-1) printk(ans[i]);
put(ans[n]);
}
signed main()
{
mp["SUN"]=7,mp["MON"]=1,mp["TUE"]=2,mp["WED"]=3,mp["THU"]=4,mp["FRI"]=5,mp["SAT"]=6;
while(1) solve();
return 0;
}