AtCoder BC108 C: Triangular Relationship

[mathjax]

問題

https://beta.atcoder.jp/contests/abc108/tasks/arc102_a

解法

a+b、b+c、c+aが全てkで割り切れると言うことは、

$$(a+b)\%k=(b+c)\%k=(c+a)\%k=0$$

ということです。

ここで、aに着目した場合、以下の2通りが考えられます・

・aがkで割り切れる場合  (a+b)%k=0よりbもkで割り切れることになり、さらにcもkで割り切れることになります。  つまり、a、b、cが全てkで割り切れる場合に条件を満たすことになります。

・aがkで割り切れない場合  例えばa%k=1の場合、b%k=k-1となり、c%k=1となります。  その場合、(c+a)%k=0となるにはkが2である必要があります。

 次にa%k=2の場合、b%k=k-2となり、c%k=2となります。  その場合、(c+a)%k=0となるにはkが4である必要があります。

 つまり、kが偶数の場合は、a%k=b%k=c%k=k/2 の場合に条件を満たすことが分かります。

よって、aが偶数の場合と奇数の場合でそれぞれ個数が変わります。

実装

n,k=gets.chomp.split.map(&:to_i)
puts k%2==0 ? (n/k)**3 + ((n-k/2)/k+1)**3 : (n/k)**3