题解 CF1033G 【Chip Game】
考虑给定
非常不显然的是,对于所有
证明
我们需要证明的是,对于
不妨设
若
- 若可以在
B 取的 pile 上取走a 个chip,那就取走a 个chip - 否则,在
G' 中应该取走a 个 chip 的 pile 上取走a 个 chip
若
接下来考虑
明确一个事实,即对于两个策略
那么,将
那么,操作完这些一起选的
如何计数
值得注意的是,
枚举
显然,选的值越小越优
钦点先手必败,并且钦点先手选较小的值,设为
如果存在
如果存在
那么需要满足的条件就是
对于后手,同理.
代码
#include<bits/stdc++.h>
using namespace std;
#define Ri register
template<typename T>inline T read(Ri T&t)
{Ri T f=1;Ri char ch=getchar();t=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch>='0'&&ch<='9')t=t*10+ch-'0',ch=getchar();t*=f;return t;}
template<typename T,typename...Args>
inline void read(T&t,Args&...args)
{read(t);read(args...);}
const long long p=998244353;
inline long long power(Ri long long x,Ri long long k=p-2)
{Ri long long re=1;for(;k;k>>=1,x=x*x%p)if(k&1)re=re*x%p;return re;}
int n,m;
long long ansA,ansB,ansF,ansL;
long long a[205];
int b[205];
int main()
{
read(n,m);
for(int i=1;i<=n;i++)read(a[i]);
for(int S=2;S<=m*2;S++)
{
for(int i=1;i<=n;i++)
b[i+1]=a[i]%S;
b[1]=0;b[n+2]=S-1;
sort(b+1,b+n+3);
for(int i=n+2,id=0;i>1;i--,id^=1)//id=0:先手必败
{
int l=b[i-1]+1,r=min(b[i],m);
if(id==0)l=max(l,b[n+1]/2+1);
else l=max(l,b[n]/2+1);
int L=max(l,S-r),R=min(r,S-l);
if(L<=R)
if(id==0)ansL+=R-L+1;
else ansF+=R-L+1;
}
}
ansA=ansB=(1ll*m*m-ansF-ansL)/2;
printf("%lld %lld %lld %lld\n",ansA,ansB,ansF,ansL);
return 0;
}