CF1710C XOR Triangle

https://www.luogu.com.cn/problem/CF1710C

打表发现一位上 ab+bcac 恒成立。

那么前面的位已经满足大于了,当前位怎么填都无所谓。也就是只要有 1 位满足大于就好了。

对 3 个式子分别记录,对 a,b,c 有无顶上界记录。因为前导零无影响(见 https://www.cnblogs.com/xugangfan/p/16537535.html),所以不用记录。

枚举下就好了。

#include <bits/stdc++.h> #define int long long #define pb push_back using namespace std; int rd() { int sum=0,f=1; char ch=getchar(); while(ch>'9'||ch<'0') { if(ch=='-') f=-1; ch=getchar(); } while(ch<='9'&&ch>='0') { sum=sum*10+ch-'0'; ch=getchar(); } return sum*f; } const int mod=998244353,N=(int)(2e5+5); char s[N]; int n; int f[N][2][2][2][2][2][2]; int dfs(int pos,bool lima,bool limb,bool limc,bool fla,bool flb,bool flc) { if(pos==n+1) { return fla&&flb&&flc; } if(~f[pos][lima][limb][limc][fla][flb][flc]) return f[pos][lima][limb][limc][fla][flb][flc]; bool mxa=lima?s[pos]:1,mxb=limb?s[pos]:1,mxc=limc?s[pos]:1; int res=0; for(int a=0;a<=mxa;a++) { for(int b=0;b<=mxb;b++) { for(int c=0;c<=mxc;c++) { bool x=(a^b),y=(a^c),z=(b^c); res=(res+dfs(pos+1,lima&(a==mxa),limb&(b==mxb),limc&(c==mxc),fla|(x+y>z),flb|(x+z>y),flc|(y+z>x)))%mod; } } } return f[pos][lima][limb][limc][fla][flb][flc]=res; } signed main() { memset(f,-1,sizeof(f)); scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++) s[i]-='0'; printf("%lld",dfs(1,1,1,1,0,0,0)); return 0; }

__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/16537580.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2021-07-31 【模板】二次剩余
2021-07-31 P3241 [HNOI2015]开店
2021-07-31 P4248 [AHOI2013]差异
2021-07-31 P6640 [BJOI2020] 封印
2021-07-31 CF427D Match & Catch
2021-07-31 P2178 [NOI2015] 品酒大会
2021-07-31 Loj#6071. 「2017 山东一轮集训 Day5」字符串
点击右上角即可分享
微信分享提示