[博弈论]acw235魔法珠(有向图游戏的和)
https://www.acwing.com/problem/content/description/237/
题意:
思路:
每一堆看成一个游戏,异或起来就是最终的答案。
终局,这堆的值为1,sg=0;
分堆用到因数分解,复杂度,取到所有小于x的因数,代表要分成这些堆。
按照题意要拿掉一堆,利用异或的性质枚举
先将所有的数都异或起来,之后再遍历异或每个数,每次让一个堆没掉。
求这些后继状态的mex,就是当前的sg值。
代码:
const int N = 1010;
int n,sg[N];
int dfs(int x){
if(sg[x] != -1) return sg[x];
if(x == 1) return sg[x] = 0;
int vis[N],d[N];
memset(vis,0,sizeof vis);
int pos = 0;
for(int i=1;i * i <= x;i++){
if(x % i == 0){
d[pos++] = i;
if(x / i != i && x / i < x) d[pos++] = x / i;
}
}
int tmp = 0;
for(int i=0;i<pos;i++)
tmp ^= dfs(d[i]);
for(int i=0;i<pos;i++){
if(i) tmp ^= dfs(d[i-1]);
tmp ^= dfs(d[i]);
vis[tmp] = 1;
}
for(int i=0;;i++)
if(!vis[i]) return sg[x] = i;
}
int main(){
memset(sg,-1,sizeof sg);
while(~scanf("%d",&n)){
int res = 0;
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
res ^= dfs(x);
}
if(res) puts("freda");
else puts("rainbow");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】