丰收

https://www.51nod.com/Contest/Problem.html#contestProblemId=4863

数位 dp,考虑对于 (x+a,y+a),a[0,d],构造 a

每一位构造的时候满足当前 x+a,y+a 这一位奇偶性相同,但是可能后面对前面有进位,于是分别开一个是否有进位即可。

f[pos][0/1][0/1][0/1] 表示当前构造到 a 的第 pos 位,前面有没有顶上界,x+a 的第 pos 位对 pos+1 位有没有进位,后面就是 y+a 同理。

#include <bits/stdc++.h> #define int long long #define pb push_back using namespace std; int f[61][2][2][2]; int d[61],X[61],Y[61],n; int dfs(int pos,int lim,int fl1,int fl2) { if(!pos) { if(!fl1&&!fl2) return 1; return 0; } if(f[pos][lim][fl1][fl2]!=-1) return f[pos][lim][fl1][fl2]; int mx=2,qwq=0; if(lim) mx=d[pos]; for(int i=0;i<=mx;i++) { for(int j=0;j<=1;j++) { for(int k=0;k<=1;k++) { int x=X[pos]+i+j-3*fl1,y=Y[pos]+i+k-3*fl2; if(x>=0&&y>=0&&x<=2&&y<=2&&x%2==y%2) { if(lim&&i==d[pos]) qwq+=dfs(pos-1,1,j,k); else qwq+=dfs(pos-1,0,j,k); } } } } return f[pos][lim][fl1][fl2]=qwq; } signed main() { cin.tie(0); ios::sync_with_stdio(false); cin>>n; while(n--) { memset(d,0,sizeof(d)); memset(X,0,sizeof(X)); memset(Y,0,sizeof(Y)); memset(f,-1,sizeof(f)); int tot=0,x; cin>>x; while(x) d[++tot]=x%3,x/=3; tot=0; cin>>x; while(x) X[++tot]=x%3,x/=3; tot=0; cin>>x; while(x) Y[++tot]=x%3,x/=3; cout<<dfs(60,1,0,0)<<'\n'; } return 0; }

__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/16442268.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示