P3131
-
题目
-
分析
题目解法比较套路。。
求和大概率前缀和,所以前缀和先预处理。。
根据题目要求:
( s u m [ r ] − s u m [ l − 1 ] ) m o d    7 = 0 ( s u m [ r ] m o d    7 ) − ( s u m [ l − 1 ] m o d    7 ) = 0 s u m [ r ] m o d    7 = s u m [ l − 1 ] m o d    7 (sum[r] - sum[l - 1]) \mod 7 = 0 \\ (sum[r] \mod 7) - (sum[l - 1] \mod 7) = 0 \\ sum[r] \mod 7 = sum[l - 1] \mod 7 (sum[r]−sum[l−1])mod7=0(sum[r]mod7)−(sum[l−1]mod7)=0sum[r]mod7=sum[l−1]mod7
所以将前缀和模 7 7 7 ,看 s u m [ i ] ( 0 ≤ i ≤ 6 ) sum[i] (0\leq i\leq6) sum[i](0≤i≤6) 出现几次。。超过两次的统计答案,对于 0 ≤ i ≤ 6 0\leq i\leq 6 0≤i≤6 [ v [ i ] [ v . s i z e ( ) − 1 ] − s u m v [ i ] [ 0 ] [v[i][v.size() -1] - sumv[i][0] [v[i][v.size()−1]−sumv[i][0] 这是单次的最远距离。找到最大即可。 -
代码
const int N = 5e4 + 5; int a[N]; ll sum[N]; std::vector<int> v[7]; int main () { //freopen("input.in", "r", stdin); //freopen("test.out", "w", stdout); int n; read(n); for (int i = 1; i <= n; i++) { read(a[i]); sum[i] = sum[i - 1] + a[i]; } for (int i = 1; i <= n; i++) sum[i] %= 7; for (int i = 1; i <= n; i++) { for (int j = 0; j < 7; j++) { if (sum[i] == j) v[j].push_back(i); } } int ans = 0; for (int i = 0; i < 7; i++) { if (v[i].size() >= 2) { ans = max(ans, v[i][v[i].size() - 1] - v[i][0]); } } cout << ans << endl; return 0 ; }
-
题型
前缀和 + 套路