1 条题解
-
0
题目理解
我们需要计算 ,其中 , 和 可能是大整数(最多 位十进制数),并且 不保证 合法。
这里的「合法」是指:
- ,即 在模 下有乘法逆元。
- 如果有解,解是唯一的(在模 意义下)。
「不合法」的情况就是 ,此时分母在模 下没有逆元,因此分数在模 下无定义。
核心思路
题目提示已经给出:
计算 等价于计算 ,其中 是 模 的乘法逆元。乘法逆元
对于质数 和 , 存在且唯一,满足:
可以用 费马小定理 求:
因为 是质数。
负数处理
题目说明:,这里是指结果的符号在模运算外处理。
实际上在模 运算中,我们通常将负数转为 范围内的数。
但在输出时,如果 是负数,那么 在 范围内会是正数,所以需要根据 的符号来判断最终输出的正负号。更好的做法是:
- 将 和 分别模 得到 和 (在 内)。
- 如果 ,则无解。
- 否则计算 。
- 计算 。
- 如果原分数 是负数(即 异号),且 ,则输出 ?
不对,题目要求 ,所以如果 是负数,那么结果应是 的形式。
实际上更简单的做法是:计算 和 时保留符号信息(C/Java 取模规则),然后计算 得到的结果可能为负数,直接输出这个负数即可。
实现步骤
-
读入
由于 可能达到 ,需要用字符串读入。 -
判断 是否为 0
大数模 可以通过逐位计算得到:
设 ,对每一位数字 做 。 -
如果
输出No Solution!。 -
否则
计算 和 (注意负数取模规则:x % p在 C/Java 中对负数得到 的值)。然后计算 (快速幂)。
计算 。
这里 可能为负数,所以乘完之后再模 会得到负数(在 范围内),直接输出即可。
样例验证
样例 1
输出正确。样例 2
(在 C/Java 中 )
,因为 是质数,,所以
输出正确。
注意事项
- 大数取模时,负数要先判断符号,然后对绝对值取模,再恢复符号。
- 快速幂计算 时, 可能为负数,要处理好。
- 最终结果在 C/Java 取模规则下直接输出,不需要调整到 。
时间复杂度
- 大数取模:
- 快速幂:,,约 次迭代。
总复杂度对于 位大数完全可行。
总结
这道题本质是 大数取模 + 费马小定理求逆元,关键在于:
- 理解分数模质数的定义。
- 正确处理大数和负数取模。
- 判断无解条件 。
只要思路清晰,实现起来并不复杂。
- 1
信息
- ID
- 5899
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者