CẶP SỐ CHIA HẾT CHO K

cho (\mathbf{k}) (2modk.*)

Cho số nguyên dương \(n\) và dãy số \(a_{1},a_{2},\ldots,a_{n}\) trong đó \(a_{i} = i\). Hãy cho biết có bao nhiêu cặp số \((a_{i},a_{j})\)\(a_{i} + a_{j}\) chia hết cho \(k\)\(i < j\).

Dữ liệu vào:

+ Dòng đầu tiên ghi số nguyên dương \(t\ (t \leq 100)\) cho biết số lượng testcase

+ \(t\) dòng tiếp theo, mỗi dòng ghi hai số nguyên dương lần lượt là \(n\)\(k\ (1 \leq k \leq n \leq 10000);\)

Kết quả:

+ Mỗi testcase in kết quả trên một dòng

Ví dụ:

Input Output
2
10 4
7 3
10
7

Solution

Ta có công thức: \((a + b)\% c = (a\% c + b\% c)\% c\)

suy ra, nếu \((a + b)\% c = 0\) thì \((a\% c + b\% c)\% c = 0\)

Do vậy, với dãy số \(1,2,3,\ldots,n\) ta thực hiện chia mỗi số cho \(k\). Dãy số trở thành

\[\mathbf{1,2,\ldots,k - 2,k - 1,0,1,2,\ldots,k - 2,k - 1,0},\ldots\ldots 1,2,\ldots n\% k\]

Ta sẽ có đúng \(n/k\) đoạn \(\mathbf{1,2,\ldots,k - 2,k - 1,0}\) và đoạn còn lại \(1,2,\ldots n\% k\) xuất hiện chỉ 1 lần

Có thể thấy với ví dụ \(n = 10;k = 4\); dãy số sau khi chia lấy dư toàn bộ cho \(k\) là:

\[\mathbf{1,2,3,0,1,2,3,0,}1,2\]

Bài toán trở thành: tìm cặp số \(a_{i},a_{j}\) để \(a_{i} + a_{j} = k\) với \(i < j\)

Với nhận xét như trên ta dễ dàng đếm được số lần xuất hiện của mỗi số:

\(d\lbrack i\rbrack = \frac{n}{k}\) (với \(i = 0\ldots k - 1\))

\(d\lbrack i\rbrack + +\) (với \(i = 1\ldots n\% k\))

Sau khi có được \(d\lbrack i\rbrack\) là số lần xuất hiện của giá trị \(i\) trong dãy số (sau khi chia lấy dư cho \(k\)) ta thấy: một số \(i\) sẽ kết với một số \(k - i\) để tạo thành một cặp số có tổng đúng bằng \(k\)

Như vậy kết quả là \(ans = d\lbrack i\rbrack \times d\lbrack k - i\rbrack\) (với \(i = 1\ldots k/2 + k\% 2 - 1\))

Tất nhiên sẽ không quên xét đến \(d\lbrack 0\rbrack\): \(ans + = d\lbrack 0\rbrack \times (d\lbrack 0\rbrack - 1)/2\);

Lưu ý với \(k\) chẵn thì cần tính thêm: \(ans + = d\lbrack k/2\rbrack \times (d\lbrack k/2\rbrack - 1)/2\);

Bạn cần đăng nhập để nộp bài

hpcode.edu.vn
Code tích cực
Trong 24h
  1. trungnam (6/7)
  2. sythai (5/8)
  3. npk1605 (5/10)
Trong 7 ngày
  1. nguyenanhvu (40/64)
  2. khieuquan (35/59)
  3. ngokhang (27/55)
Trong 30 ngày
  1. quechi (85/105)
  2. dangphong3108 (79/125)
  3. kiennhientv (79/179)
Thống kê
AC/Sub: 97887/180710
Pascal: 17121
C++: 130348
Python: 33199
Lượt xem/tải tests: 38905

Lưu Hải Phong - 2020
[email protected]