题源:P8649 [蓝桥杯 2017 省 B] k 倍区间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
一、预备知识(自行学习)
1、一维前缀和
2、同余定理
二、解题代码
- f[x] --- 某个前缀和对k取余的结果是x的个数
- f[0]=1---取余是0那这个区间就是一个K倍区间,而其他的需要两个区间的差才能构成K倍区间
- 先求res再求f[sum]的原因也是其他的需要两个区间的差才能构成K倍区间
package 前缀和;
import java.util.*;
public class LGP8649 {
public static void main(String []args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
int a[] = new int[n];
int f[] = new int[k];
f[0] = 1;
long res = 0;
int sum = 0;
for(int i=0;i<n;i++)
a[i] = in.nextInt();
for(int i=0;i<n;i++) {
sum+=a[i];
sum%=k;
res+=f[sum];
f[sum]++;
}
System.out.print(res);
}
}