CF2027E2
显然独立求出每堆的
什么时候无法下棋?当且仅当不存在一个
但是同时,比
所以这时候我们就保证了末状态一定是零。
同时对于
同时我们找到最大的
如果不存在,那么说明
通过反复进行调整,可以发现最开始的最大的
- 删掉比
更大的二进制位 - 找到
,将 的 的零位全部删掉,并且将 对应的位变成 。
考虑这样的一个
它能够转移到什么样的状态?
显然
- 其余值都是
若SG函数打表无法看出明显规律,不妨先想办法划分等效状态,这可以简化找到规律的难度
发现
如何优化我们的调整,亦或者用更简洁的语言表达?
首先是
如果我们先不删掉同为零的位,而是放任不管,那么这个位数是
然后至于最大的
接着我们进行的变化是考虑这个位往下的所有
往上的位不变。
比较麻烦啊,能不能直接算
考虑数位
因为记录差不容易处理
初始化
void dp(){
memset(f,0,sizeof f);
f[31][1][0][0][0][1]=1;
for(int now=31;now;--now)for(int flg:{0,1})for(int ap:{0,1})
for(int bit:{0,1,2})for(int c=0;c+now<=31;++c)for(int d:{0,1,2,3}){
int v=f[now][flg][ap][bit][c][d];
if(!v)continue;
int ok=(now-1<=ha);
int va=(A>>now-1)&1,vb=(B>>now-1)&1;
if(!ok){
f[now-1][flg&(vb==0)][ap][bit][c][d]+=v;
if(!flg||vb)f[now-1][flg][ap][bit][c][d]+=v;
continue;
}
int up=flg?vb:1;
for(int i=0;i<=up;++i){
if(!va&&!i)f[now-1][flg&(vb==i)][ap][bit][c][d]+=v;
else if(!va&&i){
if(ap)f[now-1][flg&(vb==i)][ap][min(bit+1,2ll)][c+1][min(3ll,max(0ll,(d<<1)-1))]+=v;
else f[now-1][flg&(vb==i)][ap][bit][c+1][min(3ll,d<<1)]+=v;
}
else if(va&&!i)f[now-1][flg&(vb==i)][1][bit][c][d]+=v;
else f[now-1][flg&(vb==i)][ap][min(2ll,bit+1)][c+1][min(3ll,max(0ll,(d<<1)-1))]+=v;
}
}
for(int flg:{0,1})for(int ap:{0,1})for(auto bit:{0,1,2})for(int c=0;c<=31;++c)for(int d=0;d<4;++d)if(f[0][flg][ap][bit][c][d]){
int sg=0;
if(d==0)sg=c^1;
else if(d==2)sg=0;
else sg=c;
if(!c)sg=0;
if(bit==0)sg=0;
else if(bit==1&&c)sg=(c-1)^1;
g[sg]+=f[0][flg][ap][bit][c][d];
}
g[0]--;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!