Task-4
寒假第四讲
一.有理数取余
1.对应思路
该问题要求计算有理数 c=abc=b**a 对19260817取模的值。根据模运算的性质,这相当于求解方程 bx≡amod 19260817b**x≡amod19260817。解的存在性取决于 bb 是否存在模19260817的逆元。具体步骤如下:
- 大数取模:由于输入的 aa 和 bb 可能非常大(最多10001位),需要将这两个数转换为模19260817后的值。这可以通过逐位处理字符串并取模来实现。
- 判断逆元存在性:若 bb 模19260817的结果为0,则方程无解,直接输出“Angry!”。否则,利用费马小定理计算 bb 的逆元,因为19260817是质数。
- 计算最终结果:将 aa 的模值与逆元相乘后再次取模,得到最终结果。
2.对应代码
1 | #include <iostream> |
3.学习总结
- 大数取模技巧:处理超大数时,可以通过逐位取模的方式避免数值溢出。例如,将字符串的每一位依次转换为当前结果的10倍加上该位数字,然后立即取模。
- 逆元计算:当模数为质数时,可以利用费马小定理快速计算逆元(即 ap−2mod pa**p−2modp),时间复杂度为 O(logp)O(logp)。
- 输入处理:注意输入的数值范围,使用字符串处理大数,并确保处理过程中不会溢出。
- 边界条件:题目保证输入的 aa 和 bb 不同时是模数的倍数,因此当 bb 的模为0时,直接判定无解。
该问题结合了数论中的模运算和逆元知识,同时考察了处理大数的技巧,综合应用了多种算法和编程技术。
二.Minimal Coprime
1.对应思路
对于每一个测试用例,我们需要找出区间 [l, r] 内所有的最小互质区间。由于我们要判断区间是否是最小互质,实际操作时可以考虑以下几点:
- 如果 l == r,那么只有一个单一的数,需要检查该数是否与自身互质,显然,对于任意数 a,
gcd(a, a) ≠ 1
,因此这类区间无法构成互质区间。 - 如果 l != r,则要判断区间 [l, r] 内每一个单元素子区间是否互质,同时对于更大的区间是否是最小互质区间。
2.代码
1 | #include<bits/stdc++.h> |
3.学习总结
最大公约数 (gcd):在这道题中,我们频繁使用 gcd
来判断两个数是否互质。通过辗转相除法,可以有效地求出两个数的最大公约数,进而判断它们是否互质。
区间内互质判断:对于每一个子区间,需要检查它们是否互质,并且判断是否包含更小的互质子区间。这要求我们在求解时要小心处理每个区间,避免遗漏。
最小互质区间的判定:最小互质区间需要满足不包含任何其他互质区间,这一点是解题的关键。通过遍历区间的所有子区间,并确保它们不含更小的互质区间,可以确保找到所有最小互质区间。
优化:虽然本解法直接暴力枚举所有区间,但考虑到题目中区间范围较大,应该在实际使用中进行一些优化,如剪枝等策略。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.