main.go 908 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package main
  2. import "fmt"
  3. func main() {
  4. var T int
  5. fmt.Scan(&T)
  6. for tc := 1; tc <= T; tc++ {
  7. var N, P int
  8. fmt.Scan(&N, &P)
  9. G := make([]int, P)
  10. for i := 0; i < N; i++ {
  11. var r int
  12. fmt.Scan(&r)
  13. G[r%P]++
  14. }
  15. g := G[0]
  16. switch P { // Even in the large case, the P is in [2, 4]
  17. case 2:
  18. g += (G[1] + 1) / 2
  19. case 3:
  20. min := minInt(G[1], G[2])
  21. g, G[1], G[2] = g+min, G[1]-min, G[2]-min
  22. g += (maxInt(G[1], G[2]) + 2) / 3
  23. case 4:
  24. g += G[2] / 2
  25. G[2] %= 2
  26. min := minInt(G[1], G[3])
  27. g, G[1], G[3] = g+min, G[1]-min, G[3]-min
  28. remain := maxInt(G[1], G[3])
  29. g += remain / 4
  30. remain %= 4
  31. if G[2] == 1 && remain == 3 {
  32. g += 2
  33. } else if G[2] != 0 || remain != 0 {
  34. g++
  35. }
  36. }
  37. fmt.Printf("Case #%d: %d\n", tc, g)
  38. }
  39. }
  40. func minInt(x, y int) int {
  41. if x < y {
  42. return x
  43. }
  44. return y
  45. }
  46. func maxInt(x, y int) int {
  47. if x < y {
  48. return y
  49. }
  50. return x
  51. }