Solução por Lucca Siaudzionis
Primeiramente, vamos definir:
- =
- =
- =
- =
Se, para algum , , já achamos nosso subconjunto e o problema acabou! Vamos então supor que não exista nenhum que satisfaça tal propriedade.
Logo, temos possíveis valores para os restos que os 's podem deixar na divisão por (os números de a ) e temos valores para , com . Desta forma, pelo princípio das casas de pombo, existem dois números distintos e tal que , desta maneira, temos (supondo ):
Desta forma, achamos nosso subconjunto!
Vamos então ao código:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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; | |
} |