2017蓝桥杯 K倍区间 前缀和+同余定理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017蓝桥杯 K倍区间 前缀和+同余定理相关的知识,希望对你有一定的参考价值。
2017蓝桥杯 K倍区间 前缀和+同余定理
给定一个长度为的数列,。
如果其中一段连续的子序列之和是的倍数,我们就称这个区间是倍区间。
你能求出数列中总共有多少个倍区间吗?
看到“区间的和”,首先想到前缀和,然后暴力枚举区间计数。
#include <bits/stdc++.h>
#define
using namespace std;
signed main()
ios_base::sync_with_stdio(false);
int n, k; cin >> n >> k;
vector<int> a(n + 1); a[0] = 0;
for(int i = 1; i <= n; i++)
cin >> a[i];
a[i] += a[i - 1];
int ans = 0;
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++)
if((a[j] - a[i - 1]) % k == 0) ans++;
return cout << ans << endl, 0;
显然这是个暴力求解的思路,结合题目所给数据范围:$(1 <= N, K <= 100000) ,(1 <= Ai <= 100000) $,果不其然的TLE了。那么考虑如何进行优化。
我们首先引入同余方程的概念:
同余方程是一个数学方程式。该方程式的内容为:对于一组整数同余定理+前缀和+状态压缩 == 解决连续子数组问题