【题解】P8649 题解
P8649 题解
思路分析
一道简单前缀和的题。
首先,看到”连续子序列求和”这一要求时,我们果断选择前缀和解答。
接着我们要分析,什么时候这段区间的和为
而又由于原数组
也就是说,我们只需判断前缀和模
我们可以来一个“回手掏”,从”模
注意:map 要将余数
依据上述步骤实现即可,然后记得开 long long。
代码
#include <iostream>
#include <map>
#define int long long
using namespace std;
map <int, int> mp; //记录每个余数出现个数的数组
signed main()
{
int n, k, ans = 0;
cin >> n >> k;
mp[0] = 1; //初始化 0 出现的次数为 1
for(int i = 1;i <= n;i++)
{
int x;
cin >> x;
ans += (x % k); //计算前缀和
mp[ans % k]++; //前缀和模 k
ans %= k;
}
int cnt = 0;
for(int i = 0;i < k;i++) cnt += (mp[i] * (mp[i] - 1)) / 2; //根据上述公式计算答案
cout << cnt << endl;
return 0;
}