12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- package main
- import "fmt"
- func main() {
- var T int
- fmt.Scan(&T)
- for tc := 1; tc <= T; tc++ {
- var N, P int
- fmt.Scan(&N, &P)
- G := make([]int, P)
- for i := 0; i < N; i++ {
- var r int
- fmt.Scan(&r)
- G[r%P]++
- }
- g := G[0]
- switch P { // Even in the large case, the P is in [2, 4]
- case 2:
- g += (G[1] + 1) / 2
- case 3:
- min := minInt(G[1], G[2])
- g, G[1], G[2] = g+min, G[1]-min, G[2]-min
- g += (maxInt(G[1], G[2]) + 2) / 3
- case 4:
- g += G[2] / 2
- G[2] %= 2
- min := minInt(G[1], G[3])
- g, G[1], G[3] = g+min, G[1]-min, G[3]-min
- remain := maxInt(G[1], G[3])
- g += remain / 4
- remain %= 4
- if G[2] == 1 && remain == 3 {
- g += 2
- } else if G[2] != 0 || remain != 0 {
- g++
- }
- }
- fmt.Printf("Case #%d: %d\n", tc, g)
- }
- }
- func minInt(x, y int) int {
- if x < y {
- return x
- }
- return y
- }
- func maxInt(x, y int) int {
- if x < y {
- return y
- }
- return x
- }
|