1 条题解
-
0
📝 题目大意
给定三个正整数 ,求 对 取模的结果。
💡 解题思路
-
题目分析:三重求和中的每一项是 ,而 各自独立遍历 、、。由于三个求和变量互不依赖,三重求和可以因式分解为三个独立求和式的乘积。数据范围 ,直接三层循环不可行,必须用数学公式 计算。
-
算法推导:
- 朴素想法是三重循环,但 级别必然超时。
- 观察求和式:$$\sum_{a=1}^{A}\sum_{b=1}^{B}\sum_{c=1}^{C} abc = \left(\sum_{a=1}^{A} a\right) \cdot \left(\sum_{b=1}^{B} b\right) \cdot \left(\sum_{c=1}^{C} c\right)$$这是因为 中 只与 有关、 只与 有关、 只与 有关,三者可以独立求和再相乘。
- 每个单变量求和是等差数列求和:。
- 因此答案为:$$\frac{A(A+1)}{2} \cdot \frac{B(B+1)}{2} \cdot \frac{C(C+1)}{2} \pmod{998244353}$$
- 代码实现:先分别计算 、、,再将三者相乘取模。由于 必为偶数,整数除法 在
long long下不会丢失精度,取模后再乘也不会溢出。
-
边界与细节:
- 最大可达 , 约为 ,在
long long()范围内,不会溢出;但若用int会溢出,务必使用long long。 - 模数 不是常规的 ,注意不要写错。
- 三项相乘时 每步都要取模,避免中间值溢出
long long(,远超long long范围)。 - 当 中任意一个为 时(虽然题目说是正整数,但严谨起见),,最终答案为 。
- 最大可达 , 约为 ,在
⏱️ 复杂度分析
- 时间复杂度:。仅进行三次等差数列求和与三次模乘运算,与输入规模无关。
- 空间复杂度:。仅使用常数个变量
a, b, c和常量mod,无额外数组或递归。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; long long a, b, c; // 使用 long long 防止溢出 const int mod = 998244353; // 题目指定的模数,注意不是 1e9+7 int main() { cin >> a >> b >> c; // 计算等差数列和 S_A = A*(A+1)/2,并取模 // 注意:1ll 强制转为 long long 防止溢出;n*(n+1) 必为偶数,整除安全 a = (1ll + a) * a / 2 % mod; b = (b + 1ll) * b / 2 % mod; c = (c + 1ll) * c / 2 % mod; // 三重求和因式分解为三个独立和的乘积,每步取模防止溢出 cout << ((a * b % mod) * c) % mod; return 0; } -
- 1
信息
- ID
- 854
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者