当前位置: 首页 > news >正文

AtCoder Beginner Contest 465 E - Digit Circus

E - Digit Circus

思路

看到这道题10的500次方的数据范围以及对于每一位数字、数字和和数字种类的讨论,我们不难想到这是一道数位DP。

那现在的问题就是怎么去完成数位DP的过程。

首先,我们的DP必须要考虑到题目要求的所有目标:3的倍数、含有3、用到3种不同的数字。同时我们也要记录数位DP通用的状态:考虑到第几位、是否触及上限。

于是,我们可以得到一个DP数组,dp[i][j][op][mask] :i 表示考虑到从左到右的第 i 位,j 表示当前余数为 j ,op 表示当前是否含有 3 ,mask 是一个对于用到哪些数字的状态压缩。考虑到这道题目要求仅仅为满足其一,数组存储的是有8个元素的容器,通过状态压缩表示满足当前条件的数字数量。

最后,在处理 DP 的过程上,我使用了记忆化搜索。

正解

#include<bits/stdc++.h> #define int long long #define si int using namespace std; typedef vector<int> arr; const int N = 505; const int mod = 998244353; string s; int n; bool vis[N][3][2][1<<10]; arr dp[N][3][2][1<<10]; inline arr dfs(int x, int tight, int mod3, int has3, si mask) { arr res = arr(8); if(x == n) { int f1 = 0, f2 = 0, f3 = 0; if(mask == 0) return res; if(mod3 == 0) f1 = 1; if(has3 == 1) f2 = 1; if(__builtin_popcount(mask) == 3) f3 = 1; int t = f1 | (f2 << 1) | (f3 << 2); res[t] = 1; return res; } if(!tight && vis[x][mod3][has3][mask]) return dp[x][mod3][has3][mask]; int up = (tight? s[x] - '0' : 9); for(int d = 0; d <= up; d++) { int ntight = tight; int nmod3 = mod3; int nhas3 = has3; si nmask = mask; ntight = tight & (d == up); if(mask == 0) { if(d != 0) { nmod3 = d % 3; nhas3 = (d == 3); nmask = (1 << d); } } else { nmod3 = (mod3 * 10 + d) % 3; nhas3 = has3 | (d == 3); nmask = mask | (1 << d); } auto nxt = dfs(x + 1, ntight, nmod3, nhas3, nmask); for(int i = 0; i < 8; i++) res[i] = (res[i] + nxt[i]) % mod; } if(!tight){ vis[x][mod3][has3][mask] = true; dp[x][mod3][has3][mask] = res; } return res; } signed main() { cin>>s; n = s.size(); arr res = dfs(0,1,0,0,0); int ans = 0; for(si i = 0; i < 8; i++) if(__builtin_popcount(i) == 1) ans = (ans + res[i]) % mod; cout<<ans; return 0; }
http://www.jsqmd.com/news/1132986/

相关文章:

  • Python并发编程实战:多线程vs多进程性能对比,一篇文章让你彻底选对方案
  • 在PC上畅玩Switch游戏:yuzu模拟器开源解决方案深度解析
  • 抖音评论采集终极指南:三步搞定批量评论提取,无需编程经验
  • Android随笔-Instrumentation
  • B站视频下载终极指南:免费获取大会员专属4K高清视频
  • 【Android 调试】Android编译ABL签名报错OpenSSL版本兼容问题分析与解决
  • JPEXS FFDec终极指南:5个简单步骤掌握Flash逆向工程与SWF文件分析
  • 如何高效获取9大网盘直链下载权限:LinkSwift完整使用指南
  • Python 后端基础(十七):Docker 和 Docker Compose 怎么用,把项目一键跑起来
  • B站视频下载终极方案:轻松获取4K高清与充电专属内容
  • 破解创意枷锁:Adobe-GenP如何重塑数字创作的经济学
  • 混合注意力(Channel+Spatial)替代SE模块:mAP涨2.3%但计算量只增5%的魔法
  • XGBoost 2.0.3 实战:Python 调参避坑 5 要点,AUC 提升 0.15
  • 毕业设计实战:基于OpenCV与CNN的人脸识别系统从零搭建【手把手教学】
  • 从零构建 AI 学术论文助手(一):架构设计与技术选型
  • 基于MCP与Playwright的Threads评论数据自动化抓取与分析实战
  • YOLOv10 vs YOLOv11 vs YOLOv12:Nature论文实测三代数模型在零售自助结账场景下的精度-速度权衡
  • 2026最新7款vibe coding编程工具学生党平替深度实测开篇实战:低成本小程序全AI开发真实经历
  • LD2410雷达传感器架构解析:企业级人体检测解决方案的最佳实践
  • LangGraph 工作流:换个角度,从方案设计到上线检查
  • switch语句
  • 富贵杯别只看名字,圆腹收住才耐看
  • AI Agent如何重构数据库运维:从智能诊断到安全自治的实践路径
  • 2026年最热门的8个SERP API(及价格清单)
  • DXVK:打破Windows游戏在Linux上的性能壁垒
  • 9大网盘直链下载神器:告别限速困扰,实现高速文件传输新体验
  • 数据库作业
  • 复杂监控场景多维步态分析平台 目标追踪布控 + 人员隐性心理态势识别白皮书
  • 空间智能重构:FancyZones如何重新定义Windows多任务工作流
  • IPXWrapper技术实现深度解析:Windows平台经典网络协议兼容性解决方案