[COCI2006-2007#6] V

news/2024/12/28 16:04:36/文章来源:https://www.cnblogs.com/YzaCsp/p/18637575

前言

赛时联想到了讲的一道题认为不可以使用数位 \(\rm{dp}\) , 但是那道题实际上形式上跟这个题不同, 所以其实是可以用的

思路

首先我们用数位 \(\rm{dp}\) 可以简单地解决选择数字的问题, 套路的用 \(f(1, r) - f(1, l - 1)\) 可以解决统计答案的问题, 还需要具体的讨论转移怎么做

考虑倍数的本质, 我们考虑套路的转移模 \(X\) 的结果, 但是因为 \(X \leq 10^{11}\) , 不可能直接转移

然后你发现, 我们有简单的 \(\mathcal{O} (\frac{A - B}{X})\) 算法可以枚举得到答案, 这样子我们可以简单地根号分治一下即可, 阈值什么的一会再说

同常规的数位 \(\rm{dp}\) 一样, 这个题一定也需要设计状态为 \(dp_{pos, m, lim, lead}\) 记录到达位置, 当前的模数, 是否有限制, 是否有前导 \(0\) 时的方案数

稍微特殊的是如果当前还在前导零状态下, 无论 \(S\) 的状态如何都可以继续往里面加上 \(0\) , 这也是符合条件的方案数

总时间复杂度 \(\mathcal{O} (\frac{A - B}{sz} + sz \cdot \omega)\) , 其中 \(\omega \approx 11 \times 10 = 110\) , 阈值取到 \(sz = 10^4 \sim 10^5\) 就可以了

实现

框架

数据点分治,

  • \(x \leq sz\) , 使用数位 \(\rm{dp}\)
  • \(x > sz\) , 使用暴力方法

数位 \(\rm{dp}\) 还是很传统的

代码

#include <bits/stdc++.h>
#define int long long
const int SZ = 10000;
const int MAXSZ = 15;
const int MAXVAL = 10000; // 记得改回来int X, A, B;
bool S[10];class BruteForces
{
private:int st;int ans = 0;bool check(int x) {while (x) { if (!S[x % 10]) return false; x /= 10; }return true;}public:void solve() {st = (A % X) ? A / X + 1 : A / X; st *= X;for (int i = st; i <= B; i += X) if (check(i)) ans++;printf("%lld", ans);}
} BF;class Intelligence
{
private:int num[MAXSZ];int dp[MAXSZ][MAXVAL][2][2];/*从高位往低位推的数位 dp 的记忆化搜索*/int dfs(int pos, int m, bool lead, bool limit) {int ans = 0;if (!pos) return (!lead && !m); // 边界条件if (~dp[pos][m][lead][limit]) return dp[pos][m][lead][limit];int up = limit ? num[pos] : 9;for (int i = 0; i <= up; i++) {if (i == 0 && lead) { ans += dfs(pos - 1, (m * 10 + i) % X, true, (i == up) & limit); continue; } // 特殊的情况if (!S[i]) continue; // 不使用违法数字ans += dfs(pos - 1, (m * 10 + i) % X, false, (i == up) & limit);}return dp[pos][m][lead][limit] = ans;}int f(int x) {int len = 0; // 递推数字串的长度while (x) { num[++len] = x % 10; x /= 10; }memset(dp, -1, sizeof(dp)); // 表示没有处理过, 而非初值(这点跟树形 dp 不同)return dfs(len, 0, true, true); // 传统}public:void solve() {printf("%lld", f(B) - f(A - 1));}
} It;signed main()
{scanf("%lld %lld %lld", &X, &A, &B);std::string a; std::cin >> a;for (int i = 0; i < a.length(); i++) S[a[i] - '0'] = true;if (X > SZ) BF.solve();else It.solve();return 0;
}

总结

根号分治思想非常好玩

枚举倍数的常见转移

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860426.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三次Blog 题目集7~8

一,前言 在题目集7和8中,我们逐步完善了智能家居强电电路模拟程序的功能和复杂性。题目集7以基本电路元件的特性和连接为核心,涵盖了开关、调速器、灯、风扇等设备的模拟,实现了多种控制设备和受控设备的电路设计与状态输出;而题目集8在此基础上新增了管脚电压显示、电流限…

题集7-8的总结

一:前言: 1.知识点:主要包括类和对象的使用、数据封装、方法的定义和使用、继承、多态、泛型、抽象类,集合框架,异常处理,字符串处理、以及基本的输入输出操作。 2.题量:现在的题目集都是一道题了,题量没什么说的。 3.难度:每次题集的难度都较大,每次都要7.8小时及以…

『联合省选2025集训』『图的连通性进阶』 知识点 总结

若有长风绕旗,那便是我在想你了。前言若有长风绕旗,那便是我在想你了。这周讲了个图论连通性板块的一些进阶知识,周六全国第一给我们讲了一些树上的问题,感觉树剖板块实现难度较大,后面几道偏思维的题会有些许好转。 这里就先写写连通性相关的进阶的一些知识点吧。 主要涵…

『联合省选2025集训』『耳分解,双极定向,三连通分量』 知识点 总结

若有长风绕旗,那便是我在想你了。前言若有长风绕旗,那便是我在想你了。这周讲了个图论连通性板块的一些进阶知识,周六全国第一给我们讲了一些树上的问题,感觉树剖板块实现难度较大,后面几道偏思维的题会有些许好转。 这里就先写写连通性相关的进阶的一些知识点吧。 主要涵…

第七-八次作业总结

一、前言 该系列题目均为设计与实现一个家居强电电路模拟程序,题目难度复杂度逐步提升,题目数量和输入信息也逐步增加。以下是对这两道题的总结: 1. 知识点家居强电电路模拟程序-3 受控窗帘设备的模拟 多个并联电路串联在一起的情况 串联电路中包含其他串联电路的情况 家居强…

AD 原理图如何进行DRC检查

如果画到PCB才发现原理图画错了,那么就为时太晚了。 画完或者后期修改PCB应该及时进行原理图的DRC检查。 1. 右下角Panels打开工程: 2. 然后我们选中整个工程的工程处,点击右键: 3. 然后左键点击compile PCB Project......... : 参考资料: https://www.fanyedu.com/content…

Vue3甘特图 - dhtmlx-gantt

Vue3甘特图 <template><div style="height:100%; background-color: white"><div id="gantt_here" style="width:100%; height:100%;"></div></div> </template><script setup> import { onMounted }…

恍恍惚惚,走到了尾声

课程链接 https://edu.cnblogs.com/campus/fzu/SE2024/作业链接 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315作业目标 回顾自己的软工实践课程学号 102202157一、学期回顾 1.1 回顾你对于软件工程课程的想象在课程开始前,我一直以为软件工程课程会聚焦于各种编…

转正了!!!!!!!!

近期&感受、问题: 1.版本优化描述:秘境排行榜;一键探险功能的顺序;背包随机类宝箱一键开启;美食家一键合成闪光美食;电玩活动跳过动画功能;许愿池自动投币;结晶一键熔炼 感受/反思:感觉自己菜菜的QAQ,各种版本的本地数据处理错误(删早了删晚了/先notify后notify…

Navicat密码导出解密导入到DataGrip中

使用Navicat导出密码:目前使用Navicat17亲测有效使用php解密代码 <?php class NavicatPassword {protected $version = 0;protected $aesKey = libcckeylibcckey;protected $aesIv = libcciv libcciv ;protected $blowString = 3DC5CA39;protected $blowKey = null;protec…

鸿蒙原生页面高性能解决方案上线OpenHarmony社区 助力打造高性能原生应用

随着HarmonyOS NEXT的正式推出,鸿蒙原生应用开发热度高涨,数量激增。但在三方应用鸿蒙化进程中,性能问题频出。为此,HarmonyOS NEXT推出了一整套原生页面高性能解决方案,包括Nodepool、HMrouter和DataCache 三大解决方案,并上架OpenHarmony开源社区,分别针对应用页面滑动…

数值计算方法(2) 数值积分方法

+++ date = 2024-12-21T13:49:00+08:00 draft = true title = 数值计算方法(2) 数值积分方法 +++ 初次发布于我的个人文档 上一期讲了插值方法,这一次自然是要运用一下插值方法了。所以这一期的主题是用插值方法计算定积分。 机械求积方法 下面我们来介绍一下怎么用插值法来得…