Link: https://ac.nowcoder.com/acm/contest/11746/B
Fonte: Niuke.com
Descrição do tópico
Para Xiaobao, se a soma de uma matriz pode dividir seu número da sorte k, é sua matriz da sorte, e outras matrizes Xiaobao são muito irritantes. Agora há uma matriz de comprimento n, e Xiaobao deseja saber quanto tempo a submatriz sortuda mais longa está entre as submatrizes desta matriz.
Para a definição de uma submatriz, se for possível obter a matriz a da matriz b excluindo vários elementos do início e do fim, respectivamente (pode ser zero ou todos, o número de exclusões antes e depois não tem ser o mesmo), então o array a é considerado filho do array b Array. (A submatriz contém a matriz original, mas não contém a string vazia)
Descrição da entrada:
vários grupos de entrada. A primeira linha contém um inteiro T (1≤T≤10), indicando que existem T grupos de dados de teste.
Cada conjunto de dados de teste contém duas linhas. A primeira linha contém dois inteiros n e k ( 1≤n≤10 5, 1≤k≤10 5), que representam o comprimento da matriz e o número da sorte de Xiaobao, respectivamente. A segunda linha contém n inteiros separados por espaço a1, a2,., An (0≤ai≤10 ^ 9), que são elementos da matriz.
Descrição da saída:
para cada grupo de dados, produza o comprimento da submatriz mais longa que pode ser divisível por k. Se não houver tal submatriz, produza -1.
Exemplo 1 Cópia de
entrada 4 3 3 1 2 3 3 5 1 2 3 3 7 1 2 3 1 6 5 Cópia de saída 3 2 -1 -1
Calcule o prefixo e quando o valor da operação restante for igual, significa que a soma do meio é um múltiplo de k
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int main(){
int t;
cin>>t;
while(t--){
int n,k,sum=0,nk[100009],mx=-1;
memset(nk,-1,sizeof(nk));
cin>>n>>k;
nk[0]=0;//
for(int i=1;i<=n;i++){
int x;
cin>>x;
sum+=x;
sum%=k;
if(nk[sum]==-1)nk[sum]=i;
else mx=max(mx,i-nk[sum]);
}
cout<<mx<<endl;
}
return 0;
}