Processing math: 100%

Soluções Doces do Dias das Bruxas

Solução por Lucca Siaudzionis

Primeiramente, vamos definir:

  • s1 = a1
  • s2 = a1+a2
  • s3 = a1+a2+a3
  • ...
  • sk = a1+a2+...+ak

Se, para algum i, si0 (mod c), já achamos nosso subconjunto e o problema acabou! Vamos então supor que não exista nenhum i que satisfaça tal propriedade.

Logo, temos (c1) possíveis valores para os restos que os si's podem deixar na divisão por c (os números de 1 a c1) e temos n valores para si, com n>c1. Desta forma, pelo princípio das casas de pombo, existem dois números distintos i e j tal que sisj (mod c), desta maneira, temos (supondo i<j):

sjsi (mod c)sjsi0 (mod c)ai+1+ai+2+...+aj0 (mod c)

Desta forma, achamos nosso subconjunto!

Vamos então ao código:


//
// halloween.cpp
//
// Created by Lucca Siaudzionis on 03/03/15.
//
// URI 1656 - Doces do Dia das Bruxas
#include <cstdio>
//------------------
#define MAXN 100100
int c, n;
int resto[MAXN];
int candy[MAXN];
//------------------
int main(){
while(scanf("%d %d", &c, &n) && n){
for(int i = 1;i <= n;i++){
scanf("%d", &candy[i]);
candy[i] %= c;
}
for(int i = 1;i <= c;i++) resto[i] = -1;
int sum = 0;
resto[0] = 0;
for(int i = 1;i <= c;i++){
sum += candy[i];
sum %= c;
if(resto[sum] != -1){
printf("%d", resto[sum]+1);
for(int j = resto[sum]+2;j <= i;j++) printf(" %d", j);
printf("\n");
break;
}
resto[sum] = i;
}
}
return 0;
}