P2261 [CQOI2007] 余数求和
发布人:shili8
发布时间:2025-02-03 00:21
阅读次数:0
**余数求和**
**题目描述**
给定一个正整数 $n$ 和一个正整数序列 $a_1, a_2, ldots, a_n$, 求出所有可能的 $k$ 值(其中 $0leq k < n$)对应的余数之和。
**例子**
假设 $n =5$,且序列为:$a_1 =3, a_2 =7, a_3 =11, a_4 =15, a_5 =19$。那么,对于每个可能的 $k$ 值(其中 $0leq k < n$),我们需要计算出对应的余数之和。
**解决方案**
为了解决这个问题,我们可以使用模运算来求出每个 $a_i$ 的余数,然后将这些余数相加。具体来说,我们可以使用以下公式:
$$sum_{i=0}^{n-1} a_{k+i mod n} = sum_{i=0}^{n-1} (a_k + i cdot d)$$其中 $d$ 是 $n$ 的除数。
**代码示例**
cpp#include <iostream> using namespace std; int main() { int n; // 序列长度 cin >> n; int a[n]; // 序列元素 for (int i =0; i < n; i++) { cin >> a[i]; } int k; // 起始索引 cin >> k; long long sum =0; //余数之和 for (int i =0; i < n; i++) { int index = (k + i) % n; // 计算当前索引 sum += a[index]; // 将当前元素加到总和中 } cout << sum << endl; return0; }
**注释**
* `n` 表示序列的长度。
* `a` 是一个整数数组,存储了序列中的每个元素。
* `k` 是起始索引。
* `sum` 是余数之和。
**时间复杂度**
该算法的时间复杂度为 O(n),其中 n 是序列长度。