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了。那么考虑如何进行优化。

我们首先引入同余方程的概念:

同余方程是一个数学方程式。该方程式的内容为:对于一组整数同余定理+前缀和+状态压缩 == 解决连续子数组问题

2017蓝桥杯第十题(k倍区间)

K倍区间 -- 蓝桥杯

2017年蓝桥杯省赛

第八届蓝桥杯-k倍区间

蓝桥杯 K倍区间 python