【动态规划 C++动态规划】P10986 [蓝桥杯 2023 国 Python A] 2023|普及+

【动态规划 C++动态规划】P10986 [蓝桥杯 2023 国 Python A] 2023|普及+

本文涉及知识点

C++动态规划 数位dp

[蓝桥杯 2023 国 Python A] 2023

题目背景

建议使用 PyPy3 提交本题。

题目描述

给定 n , m n, m n,m,请求出所有 n n n 位十进制整数中有多少个数中恰好出现了 m m m 个 2023 2023 2023。

例如 00202312023 00202312023 00202312023 是一个 11 11 11 位的出现了 2 2 2 个 2023 2023 2023 的十进制整数。

由于结果可能很大,请输出答案对 998 , 244 , 353 998,244,353 998,244,353 取模的结果。

输入格式

输入一行包含两个整数 n , m n,m n,m,用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

样例 #1

样例输入 #1

5 1 

样例输出 #1

20 

提示

对于 40 % 40\% 40% 的评测用例, n ≤ 10 5 , m ≤ 10 n \le 10^5,m \le 10 n≤105,m≤10;

对于所有评测用例, 4 ≤ n ≤ 10 5 , 0 ≤ 4 m ≤ n 4 \le n \le 10^5,0 \le 4m \le n 4≤n≤105,0≤4m≤n。

P10986 # 数位dp
自定义状态:两部分合成int。第一部分:2023的数量i1,取值范围[0,m+1],超过m+1个,算m+1个。第二部分:i2,结尾是202,3;20,2,2;1;其它0。
202遇到3,i1++,i2=0。遇到0,i2=2,其它规则1。
20遇到2,i2++。其它规则1。
2遇到0,i2++。其它规则1。
规则1:遇到2,i2=1,否则i2=0。
时间复杂度: 每位的状态m,n位,字符集长度 ∑ \sum ∑是10。O(nm ∑ \sum ∑),超时。

组合数学 放球问题 容斥原理

f(x)记录至少x个2023的方案数。
x个2023,插入n-4x个数。 i f f iff iff n-4x个相同的球,放到x+1个不同的盒子。n-4x个数,可以从0到9任意选择。
本题答案: f(m)-f(m+1)+f(m+2) ⋯ \cdots ⋯f(n/4)

代码

核心代码

#include<iostream>#include<sstream>#include<vector>#include<map>#include<unordered_map>#include<set>#include<unordered_set>#include<string>#include<algorithm>#include<functional>#include<queue>#include<stack>#include<iomanip>#include<numeric>#include<math.h>#include<climits>#include<assert.h>#include<cstring>#include<bitset>usingnamespace std;template<classT=int> vector<T>Read(int n,constchar* pFormat ="%d"){ vector<T>ret(n);for(int i=0;i<n;i++){scanf(pFormat,&ret[i]);}return ret;}template<classT=int> vector<T>Read(constchar* pFormat ="%d"){int n;scanf("%d",&n); vector<T> ret; T d;while(n--){scanf(pFormat,&d); ret.emplace_back(d);}return ret;} string ReadChar(int n){ string str;char ch;while(n--){do{scanf("%c",&ch);}while(('\n'== ch)); str += ch;}return str;}template<classT1,classT2>voidReadTo(pair<T1, T2>& pr){ cin >> pr.first >> pr.second;}template<int MOD =1000000007>classC1097Int{public:C1097Int(longlong llData =0):m_iData(llData% MOD){} C1097Int operator+(const C1097Int& o)const{returnC1097Int(((longlong)m_iData + o.m_iData)% MOD);} C1097Int&operator+=(const C1097Int& o){ m_iData =((longlong)m_iData + o.m_iData)% MOD;return*this;} C1097Int&operator-=(const C1097Int& o){ m_iData =(m_iData + MOD - o.m_iData)% MOD;return*this;} C1097Int operator-(const C1097Int& o){returnC1097Int((m_iData + MOD - o.m_iData)% MOD);} C1097Int operator*(const C1097Int& o)const{return((longlong)m_iData * o.m_iData)% MOD;} C1097Int&operator*=(const C1097Int& o){ m_iData =((longlong)m_iData * o.m_iData)% MOD;return*this;} C1097Int operator/(const C1097Int& o)const{return*this* o.PowNegative1();} C1097Int&operator/=(const C1097Int& o){*this/= o.PowNegative1();return*this;}booloperator==(const C1097Int& o)const{return m_iData == o.m_iData;}booloperator<(const C1097Int& o)const{return m_iData < o.m_iData;} C1097Int pow(longlong n)const{ C1097Int iRet =1, iCur =*this;while(n){if(n &1){ iRet *= iCur;} iCur *= iCur; n >>=1;}return iRet;} C1097Int PowNegative1()const{returnpow(MOD -2);}intToInt()const{return(m_iData + MOD)% MOD;}private:int m_iData =0;;};template<classT>classCFactorial{public:CFactorial(int n):m_res(n +1){ m_res[0]=1;for(int i =1; i <= n; i++){ m_res[i]= m_res[i -1]* i;}} T Com(int iSel,int iCanSel)const{return m_res[iCanSel]/ m_res[iSel]/ m_res[iCanSel - iSel];} T Com(const vector<int>& cnt)const{ T biRet =1;int iCanSel = std::accumulate(cnt.begin(), cnt.end(),0);for(int j =0; j < cnt.size(); j++){ biRet *=Com(cnt[j], iCanSel); iCanSel -= cnt[j];}return biRet;} vector<T> m_res;};template<classT>classCBallBox{public:CBallBox(CFactorial<T>& fac,int cntBall,int cntBox):m_fac(fac),m_iN(cntBall),m_iM(cntBox){} T NotNotNot(){//球不同盒子不同不能为空returng(m_iM);} T NotIsNot(){//球不同盒子同不能为空returnNotNotNot()/ m_fac.m_res[m_iM];} T IsNotIs(){//球同盒子不同能为空return m_fac.Com(m_iM -1, m_iN + m_iM -1);} T IsNotNot(){//球同盒子不同不能为空if(m_iN < m_iM){return0;}return m_fac.Com(m_iM -1, m_iN -1);}constint m_iM, m_iN;//m_iN球,m_iM盒子protected: T g(int m)const{ T biRet;for(int i =0; i <= m; i++){auto cur = m_fac.Com(i, m)*Pow(T(m - i), m_iN);if(1& i){ biRet -= cur;}else{ biRet += cur;}}return biRet;} CFactorial<T>& m_fac;};classSolution{public:intAns(int n,int m){typedef C1097Int<998244353> BI; CFactorial<BI>fac(n); vector<BI> anss;auto Cnt =[&](int m){constint iBoxCnt = n -4* m; CBallBox<BI>cb(fac, iBoxCnt, m +1); BI c1 = cb.IsNotIs();auto ans = c1 *BI(10).pow(iBoxCnt); anss.emplace_back(ans);}; BI ans;for(int i =0;4*(i + m)<= n; i++){Cnt(m+i);constint sign =(i +1)%2*2-1; ans += anss.back()* sign*fac.Com(m,i+m);}return ans.ToInt();}};intmain(){#ifdef_DEBUGfreopen("a.in","r",stdin);#endif// DEBUGint n,m;scanf("%d%d",&n,&m);auto res =Solution().Ans(n,m);#ifdef_DEBUG /* Out(pa, "pa="); Out(vm, ",vm="); printf("n=%d", n);*/#endif cout << res << std::endl;return0;}

单元测试

TEST_METHOD(TestMethod11){auto res =Solution().Ans(5,1);AssertEx(20, res);}TEST_METHOD(TestMethod12){auto res =Solution().Ans(4,1);AssertEx(1, res);}TEST_METHOD(TestMethod13){auto res =Solution().Ans(9,2);AssertEx(30, res);}TEST_METHOD(TestMethod14){auto res =Solution().Ans(6,1);AssertEx(300, res);}TEST_METHOD(TestMethod15){auto res =Solution().Ans(14,3);AssertEx(1000, res);}TEST_METHOD(TestMethod16){auto res =Solution().Ans(20,3);AssertEx(525290362, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步ZEEKLOG学院,听白银讲师(也就是鄙人)的讲解。
https://edu.ZEEKLOG.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.ZEEKLOG.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

Read more

7个理由让TanStack Table成为2024年前端表格库的首选方案

7个理由让TanStack Table成为2024年前端表格库的首选方案 【免费下载链接】tableTanStack/table: TanStack Table (原名 React Table) 是一个灵活且高性能的表格组件库,用于构建复杂数据表视图,适用于React环境,具有高度可配置性和优化的性能表现。 项目地址: https://gitcode.com/gh_mirrors/ta/table TanStack Table是一个功能强大的无头UI库,专为构建高性能数据网格组件设计。它支持React、Vue、Solid等多种前端框架,通过100%控制标记和样式,让开发者能够打造完全定制化的表格解决方案。轻量级架构配合TypeScript原生支持,使它成为处理复杂数据展示的理想选择。 图:TanStack Table v8版本宣传图,展示其无头UI架构理念 从零开始了解TanStack Table 项目基础速览 📚 作为GitHub加速计划中的明星项目,TanStack Table(前身为React Table)采用TypeScript和JavaScript开发,核心代

By Ne0inhk
LangChain 消息处理全解析:缓存、过滤、合并与流式输出实战

LangChain 消息处理全解析:缓存、过滤、合并与流式输出实战

文章目录 * 一、消息内存缓存 * 核心概念 * 关键组件 * 代码流程 * 运行效果 * 二、消息过滤 * 核心概念 * 关键函数 * 过滤参数 * 代码示例 * 过滤逻辑 * 三、消息合并 * 核心概念 * 关键函数 * 代码示例 * 合并效果 * 两种使用方式 * 四、流式输出 * 什么是流式输出 * 为什么需要? * 典型应用 * 五、同步 vs 异步流式 * 核心区别 * 工作原理 * 何时使用异步? * 六、流式输出基础用法 * 同步流式 * 异步流式 * 七、输出解析器 * 八、流式输出实际应用 * 1. 聊天机器人 * 2. 多用户并发 * 3. FastAPI 集成 * 九、常见问题

By Ne0inhk

LTspice Web中SPICE模型调用的完整指南(在线仿真应用)

在线电路仿真实战:手把手教你搞定 LTspice Web 中的 SPICE 模型调用 你有没有遇到过这样的场景?正在远程开会,突然想验证一个电源拓扑,但手边只有笔记本电脑、没有安装 LTspice;或者在教学演示时,学生因为系统兼容问题无法复现你的仿真结果。这时候, LTspice Web 就成了救场神器——无需安装、打开浏览器就能跑电路仿真。 但真正用起来才发现:桌面版里轻轻一点就能加载的 .lib 模型,在网页端却频频报错“Unknown subcircuit”。这背后不是软件 bug,而是 在线环境与本地系统的根本差异 。 今天我们就来彻底讲清楚:如何在 LTspice Web 中正确调用第三方或自定义 SPICE 模型。从原理到实操,从常见坑点到高级技巧,一篇文章帮你打通全流程。 为什么模型会“找不到”?先搞懂 SPICE 的查找逻辑 在动手之前,必须明白一件事:LTspice

By Ne0inhk