Dada una secuencia de longitud N, A1, A2, ... AN, si la suma de una subsecuencia continua Ai, Ai + 1, ... Aj es un múltiplo de K, llamamos a este intervalo [i, j] K Intervalo de tiempos.
¿Puedes encontrar el número total de intervalos de K veces en la secuencia?
Formato de entrada La
primera línea contiene dos números enteros N y K.
Cada una de las siguientes N líneas contiene un entero Ai.
Formato de
salida Genera un número entero, que representa el número de intervalos de K veces.
Rango de datos
1≤N, K≤100000,1≤Ai≤100000
Ejemplo de entrada:
5 2
1
2
3
4
5
Ejemplo de salida:
6
Código AC:
#include<stdio.h>
int n,k;
long long s[100010];
int m[100010];
long long ans;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)//求前缀和
{
scanf("%lld",&s[i]);
s[i]+=s[i-1];
}
m[0]=1;//s[0]模k为0
for(int i=1;i<=n;++i)//区间右端点r固定为i,讨论左端点l
{
//只要s[r]和s[l]模k相同,[l+1,r]必为k倍区间
//找到在s[r]之前的所有满足条件的s[l]即可
ans+=m[s[i]%k];
++m[s[i]%k];
}
printf("%lld",ans);
return 0;
}