题目链接:传送门
官方题解:
有一个结论:必有连续的一串数和为n的倍数
证明:先求个前缀和
若这个前缀和中有的倍数,则这个前缀即为答案
若这个前缀和中没有的倍数,即模余~
由抽屉原理得,至少有两个前缀和模的余数相同,得证
所以,先求前缀和
再找前缀和模或两个前缀和模的余数相等
所以就是找这个余数相等的区间
#include <bits/stdc++.h>
#define
using namespace std;
typedef long long ll;
int n, l, r; ll a[A], b[A], sum[A], t[A];
int main(int argc, char const *argv[]) {
cin >> n;
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), b[i] = a[i];
for (int i = 1; i <= n; i++) {
sum[i] = (sum[i - 1] + a[i] % n) % n;
if (!t[sum[i]]) t[sum[i]] = i;
else {l = t[sum[i]] + 1; r = i; break;}
}
for (int i = l; i <= r; i++) printf("%lld %lld\n", i, b[i]);
}