``` #include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; int main(){ cin>>n>>m; ll a[n+10],cnt[m+10]; memset(cnt,0,sizeof(cnt)); ll sum=0,ans=0; for(int i=1;i<=n;i++){ cin>>a[i]; ans+=cnt[sum%m]; cnt[sum%m]++; sum+=a[i]; } ll s=sum; sum=0; for(int i=1;i<=n;i++){ cnt[sum%m]--; ans+=cnt[s%m]; s+=a[i]; sum+=a[i]; } cout<<ans; }```一个湖泊周围有 N 个休憩所。这些休憩所按顺时针方向被标记为 1,2,…,N。从休憩所 i 到休憩所 i+1(其中休憩所 N+1 指的是休憩所 1)顺时针行走需要 A i 步。已知从某个休憩所 s 到另一个不同的休憩所 t 顺时针行走的最短步数是 M 的倍数。我们需要计算所有可能的 (s,t) 组合的数量。
时间: 2025-06-26 11:06:28 浏览: 14
这个程序是用来解决上述描述的问题的,下面我将逐步解析代码及其背后的逻辑。
---
### **题目背景**
我们有一个环形结构的湖泊周围分布着 `N` 个休憩所。每个相邻休憩所之间的距离由数组 `A[]` 表示。对于任意两个不同的点 `(s, t)`,如果从 `s` 到 `t` 的顺时针最短路径长度是 `M` 的整数倍,则该组合被视为有效。目标是统计所有的有效 `(s, t)` 对的数量。
---
### **核心思路**
此题的核心思想基于**前缀和与同余性质**:
1. 假设当前位于第 `i` 个休憩所时,累积走过的步数为 `sum`。
2. 如果从某起点到当前位置的距离是 `M` 的倍数,则说明它们之间存在一条满足条件的有效路径。
3. 因此可以利用模运算的结果(即 `sum % m`),通过记录之前有多少次出现相同的模值来快速判断并统计符合条件的路径对。
以下是详细步骤分解:
- 使用变量 `cnt[x]` 来存储在某一时刻已经到达过的位置对应的「mod M」结果次数。
- 当遍历过程中再次遇到同样的 mod 结果时,意味着这些位置间的路程刚好能被分成若干段均为 M 长度的小路。
---
### **代码解析**
```cpp
#include <bits/stdc++.h> // 引入常用的头文件集合
using namespace std; // 标准命名空间简化书写
// 定义类型别名方便处理大数据量
typedef long long ll;
int n, m; // 输入参数 N 和 M 分别表示休憩所数量以及判定因子
int main() {
cin >> n >> m; // 接收输入
ll a[n + 10]; // 存储每一段从 i->(i+1)%n 所需步数
ll cnt[m + 10]; // 计算累计路径中各个 Mod(m) 出现频率计数表初始化全零状态memset函数完成.
memset(cnt, 0, sizeof(cnt));
ll sum = 0, ans = 0;// 初始化总累加器及最终答案都归于初始值0.
// 第一次扫描序列构建初步信息基础框架同时更新部分匹配数目
for (int i = 1; i <= n; ++i){
cin >> a[i];
// 更新 answer 加上先前已有相同余数值贡献
ans += cnt[(sum % m + m )%m ];
// 注意这里做了规范化操作防止负数情况影响准确率
// 累积增加对应余数值出现频次准备后续循环再用作对比参考依据
cnt[(sum % m + m )%m ]++;
// 实际推进当前节点实际物理意义上的移动轨迹模拟过程
sum += a[i];
}
ll s = sum ; // 暂存整个圈闭合完整绕回原地之后总的行程总量供下一步调整差分计算公式应用需求场景下使用特殊标识意义所在之处体现出来即可理解了哦!
sum = 0 ;
// 进行第二次迭代修正前面阶段可能存在的交叉重叠误差项消除工作确保最后所得结论绝对无误才输出正确解法方案设计原则遵循一致性要求达到预期目的效果最好啦😊~
for (int i = 1; i <= n; ++i){
cnt[ (sum % m + m ) % m ] -- ;
ans += cnt[ ((s - sum) % m + m ) % m ];
s += a[i];
sum += a[i];
}
cout << ans ; // 输出最终计算好的全部合法配对总数额成果展示时间🎉🎊✨
}
```
---
### **算法复杂度分析**
由于两次简单线性扫描便完成了任务因此总体效率非常高O(N),非常适合大规模数据范围条件下高效求解问题实例验证实践证明可行性强👍👍👍
---
阅读全文
相关推荐



















