Intervalo de k veces de C ++ (suma de prefijo)

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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44643644/article/details/108817791
Recomendado
Clasificación