返回题解分享
讨论 / 题解分享/ 帖子详情

k倍区间(编程题) - 题解

#include <bits/stdc++.h>
#define endl '\n'
typedef long long ll;
using namespace std;
//数据结构在这里定义

const int N =1e6+10;
int a[N];
ll sum[N];//求和要ll 
int cnt[N];//收集余数为i的 sum区间个数 
void solve(){
	int n,k;
	cin >> n >> k;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		//初始化前缀和 
		sum[i] = sum[i-1] + a[i]; 
	}
	ll res = 0;
	//余数为0的区间,哪怕只有一个,也能组成一个K倍区间
	//只有它初始值为1 
	cnt[0] = 1;
	for(int i = 1; i <= n; i++){
		cnt[sum[i] % k]++;
		//记录下 余数为 x 的 sum前缀和区间有多少 
	}
	//收集每个余数的情况 
	for(int i = 0; i < k;i++){
		//cnt[0]=1 保证了只有一个区间余数为0时
		//让cnt[0]=2 res能正确的 + 1
		//如果没有余数为0的区间 res + 0 
		res += cnt[i] * (cnt[i] - 1) / 2;
		//如果有n个区间余数都是m,从中任取两个做差
		//[i,j]这个区间的余数变成0即是k倍区间 C n 2 
	}
	cout << res << endl;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;//多组数据要cin
	//cin >> t;
	t = 1;
	while(t--){
		solve();
	} 
	return 0;//必须加return 0 
}
0 回复 0 转发 2 喜欢 6 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!