ABC 108 C問題

問題概要

整数\(N, K\) が与えられる。\(N\)以下の整数の組\((a, b, c)\)であって、\(a+b, b+c, c+a\) が全て\(K\)の倍数であるような物の個数を求めよ。ただし、\(a, b, c\)の順番を入れ替えただけの組も異なるものとする。また、\(a, b, c\)のなかに同じ数があっても良い。

制約

  • 1 ≤ \(N, K\) ≤ 2 \( \times \) 105
  • \(N, K\)は整数である。

考えたこと

\(a+b\)は\(K\)の倍数

\(b+c\)は\(K\)の倍数

\(c+a\)は\(K\)の倍数

この3つの条件から、 \(2a, 2b, 2c\) は全てKの倍数であることが導かれる。

  • \(K\) が奇数の時

2と\(K\)は互いに素なので、\(a, b, c\)が全て\(K\)の倍数になれば良い。

  • \(K\) が偶数の時

\(K\)が奇数の時と同じように、\(a, b, c\)が全て\(K\)の倍数になる場合の他に、

$$a, b, c \equiv \frac{K}{2} ( mod K ) $$

となる場合を追加する必要がある。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

int main() {
  ll n, k; cin >> n >> k;
  ll cnt = 0;
  ll ans = 0;
  for(ll i = 1; i <= n; i++) {
    if(i % k == 0) cnt++;
  }
  ans += (ll)(cnt * cnt * cnt);
  if(k % 2 == 0) {
    cnt = 0;
    for(ll i = 1; i <= n; i++) {
      if(i % k == (k/2)) cnt++;
    }
    ans += (ll)(cnt * cnt * cnt);
  }
  cout << ans << endl;

  return 0;
}