public class Solution { public int solve(ArrayList<Integer> A, int B) { Collections.sort(A); int size = A.size(); if (size == 1) return 0; int max = (A.get(size - 1) + A.get(size - 2)) / B; int min = (A.get(0) + A.get(1)) / B; int count = 0; for (int i = min; i < max; i ++) { int p = i + 1; for (int j = 0; j < A.size(); j ++) { int curr = A.get(j); int x = p * B - curr; int yIndex = Collections.binarySearch(A, x); if (yIndex >= 0) { int l = yIndex; int r = yIndex + 1; while (r < A.size() && A.get(r) == x) { if (r != j) { count ++; } r ++; } while (l >= 0 && A.get(l) == x) { if (l != j) { count ++; } l --; } } } } return (count / 2) % (int) (10e9 + 7); } }
public class Solution { public int solve(ArrayList<Integer> A, int B) { // A = [1, 2, 3, 4, 5] // B = 2 // [0 1] // [2 3] // 0 : 2 * 1 / 2 // 1 : 3 * 2 / 2 long[] freq = new long[B]; for (int i = 0; i < A.size(); i ++) { int n = A.get(i); freq[n % B]++; } long sum = freq[0] * (freq[0] - 1) / 2; if (B % 2 == 0) { sum += freq[B / 2] * (freq[B / 2] - 1) / 2; for (int i = 1; i <= B / 2 - 1; i ++) { sum += freq[i] * freq[B - i]; } } else { for (int i = 1; i <= B / 2; i ++) { sum += freq[i] * freq[B - i]; } } return (int) (sum % 1000000007); } }