1 条题解
-
0
题目分析
本题要求找到最大的 ,使得 的价格在不超过 的情况下,末尾有尽可能多的连续数字 。
关键观察:价格 末尾有 个连续的 ,等价于:
$$k \times b \equiv d \times \frac{10^p - 1}{9} \pmod{10^p} $$算法思路
核心思想:数论 + 二分答案
主要步骤:
-
特殊情况处理 ()
- 当 时,问题转化为找到最大的 使得 末尾有 个0
- 这等价于 能被 整除
- 通过分解 的质因数(2和5的因子)来优化计算
-
一般情况 ()
- 使用二分答案确定最大的连续 的数量
- 对于每个 ,检查是否存在 满足条件
数学推导
对于 的情况,我们需要解方程:
$$k \times b \equiv d \times \frac{10^p - 1}{9} \pmod{10^p} $$等价于:
$$k \times b \times 9 \equiv d \times (10^p - 1) \pmod{9 \times 10^p} $$进一步转化为:
$$k \times (9b) \equiv d \times (10^p - 1) \pmod{9 \times 10^p} $$算法实现细节
1. 大数处理
由于 可以达到 ,需要使用自定义的大数类:
struct node { int st[MAXN], leng; // 支持大数的比较、减法、除法等操作 };
2. 扩展欧几里得算法
用于求解线性同余方程:
int exgcd(int a, int b, int &x, int &y) { if (!b) return x = 1, y = 0, a; int d = exgcd(b, a % b, y, x); y -= x * (a / b); return d; }
3. 二分答案框架
int L = 0, R = 1e4, res = 0; while (L <= R) { int mid = L + R >> 1; if (checkit(mid)) res = mid, L = mid + 1; else R = mid - 1; }
4. 检查函数
checkit(p)
对于给定的 ,检查是否存在满足条件的 :
- 计算
- 使用扩展欧几里得解方程
- 验证解是否在约束范围内
代码结构
主要组件
-
大数类
node
- 支持比较、减法、除法运算
- 处理高达 的大数
-
核心检查逻辑
bool checkit(int p) { // 模运算和方程求解 // 验证解的存在性和有效性 }
-
特殊情况处理 ()
if (!D) { // 处理末尾0的特殊情况 // 基于2和5的因子分解 }
复杂度分析
- 时间复杂度:,其中 是二分的范围
- 空间复杂度:,主要用于存储大数
关键技巧
- 模运算优化:通过模 来减少计算量
- 扩展欧几里得:高效求解线性同余方程
- 大数运算:自定义大数类处理超大输入
- 二分答案:将最优解问题转化为判定问题
样例分析
样例1:
- 最大连续9的数量为2(对应 , )
样例2:
- 最大连续4的数量为3(对应 , )
样例3:
- 最大连续4的数量为2( 的价格超过限制)
该算法通过巧妙的数学转化和高效的大数处理,成功解决了这个具有挑战性的数论问题。
-
- 1
信息
- ID
- 3232
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者