ARC134E Modulo Nim
Description
现在在黑板上写了 个数 ,有两个人轮流来修改这些数字并进行博弈。如果所有数字的最大值是 当前操作者胜利。否则在 中选择一个数 并将所有数字改为它模 的余数
给定 ,求有多少 满足 且 在博弈中先手必胜?
Solution
将局面转化为不可重集合(不过在最后统计局面数量时不能将相同的 只处理一个)
局面是必败态。特判
先尝试相对简单的策略,比如选择 :
- ,此时特殊处理 是必败态。可重集合中存在奇数则是必胜态。
下面讨论中将默认集合中没有奇数,且最大值
- ,如果集合中必然存在 的数字,因为 的胜负手已定,如果不是两个余数都存在那么可以直接获胜。否则不会选择
下述讨论中无特殊情况将要求集合中存在模 为 和余 ,且这些元素都是偶数。
- ,不是 倍数的偶数将导致后手失败,这里仍然出现了一个必败特例 ,模 进入必胜态,模 一概讨论失效了
限制更紧了,需要满足集合里面元素是 的倍数
注意到 , 的倍数只有 个。于是可以将这 个数字是否存在压成二进制,先做一次 即在 的限制下每种集合有多少选法,对于那些 值不合法的从所有方案中减去。
方案数都是 , 集合的方案是 的次幂减去所有数全选
求 值可以暴力递归,并在不是所有数都为 的倍数的边界直接判断,于是递归到的状态数和存下来的状态数同级
Code
const int N=210;
map<vector<int>,int> SG;
int All=1,a[N],n;
int dp[2][1<<16];
inline int calc_SG(vector<int> vec){
if(vec.size()==1&&vec[0]<=2) return 0;
if(vec.size()==2&&vec[0]==4&&vec[1]==8) return 0;
for(auto v:vec) if(v%12) return 1;
if(SG.count(vec)) return SG[vec];
int Mx=vec.back();
for(int m=5;m<=Mx;++m){
vector<int> nxt;
for(auto v:vec) if(v%m) nxt.emplace_back(v%m);
sort(nxt.begin(),nxt.end());
nxt.erase(unique(nxt.begin(),nxt.end()),nxt.end());
if(!calc_SG(nxt)) return SG[vec]=1;
}
return SG[vec]=0;
}
signed main(){
n=read();
int Mx=0,Mn=210;
rep(i,1,n){
ckmul(All,a[i]=read());
ckmax(Mx,a[i]);
ckmin(Mn,a[i]);
}
--All;
if(All<0) All=mod-1;
if(Mn==1){
if(Mx==1) puts("0");
else print(All);
return 0;
}
int ill=1;
for(int i=1;i<=n;++i){
if(a[i]<4) ill=0;
else if(a[i]>=8) ckadd(ill,ill);
}
--All;
All-=ill;
if(Mn>=4) ++All;
if(Mn>=8) ++All;
int cur=0;
dp[cur][0]=1;
Mx/=12;
int U=(1<<Mx)-1;
for(int i=1;i<=n;++i){
for(int s=0;s<=U;++s) if(dp[cur][s]){
for(int j=1;j*12<=a[i];++j){
ckadd(dp[cur^1][s|(1<<(j-1))],dp[cur][s]);
}
dp[cur][s]=0;
}
cur^=1;
}
for(int s=1;s<=U;++s){
vector<int> vec;
for(int j=1;j<=Mx;++j) if(s>>(j-1)&1) vec.emplace_back(j*12);
if(!calc_SG(vec)) All-=dp[cur][s];
}
print((All%mod+mod)%mod);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律