思路
- 通过对四边形、五边形、六边形的模拟我们可以知道,野猫是否能赢只与黑色三角形的位置有关,我们只需要知道黑色三角形的每条边各需要切多少次才能成为裸露的,显然有几个顶点就需切几下,这个操作很简单,详细见代码。
- 然后我们就可以找规律了,我们用
(a,b,c)
表示黑色三角形的三边外分别有a,b,c个顶点。 - 显然
(0,0,k)
,(0,k,0)
,(k,0,0)
(k为任意正整数)这三种状态是必胜态。(注意这一类不可包括在下一类当中) - 显然
(0,1,1)
,(1,0,1)
,(1,1,0)
是必败态。 (0,b,c)
,(a,0,c)
,(a,b,0)
,以第一个为例,当b+c
为奇数时是必胜态,为偶数时是必败态。因为这三种状态都可以转化为上一类状态。(1,1,1)
是必胜态,由此可以推出:(a,b,c)
当a+b+c-3
为奇数时必败,为偶数时必胜。
代码
#include<cstdio>
#define ri register int
const int maxn=5e4+21;
int n,a,b,c;
int read(){
int x=0;char c=getchar();
while(c>'9'||c<'0') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
void swap(int &x,int &y){
int t=x;x=y;y=t;
}
void pre(int x,int y,int z){
if(x>y) swap(x,y);
if(y>z) swap(y,z);
if(x>y) swap(x,y);
a=y-x-1;
b=z-y-1;
c=x-z+n-1;
}
bool pd(){
if(!a&&!b) return 1;
if(!a&&!c) return 1;
if(!b&&!c) return 1;
if(!a) if((b+c)&1) return 1;else return 0;
if(!b) if((a+c)&1) return 1;else return 0;
if(!c) if((b+a)&1) return 1;else return 0;
if(!((a+b+c-3)&1)) return 1;
return 0;
}
int main(){
n=read();
int x=read(),y=read(),z=read();
for(ri i=1;i<n-2;++i) a=read(),b=read(),c=read();
pre(x,y,z);
if(pd()) printf("JMcat Win");
else printf("PZ Win");
return 0;
}