trsing’s diary

勉強、読んだ本、仕事で調べたこととかのメモ。

AtCoder Regular Contest 102 C - Triangular Relationshipメモ

長らく競プロ休止していましたが、リハビリ目的もかねて AtCoder ProblemsのBoot camp for Beginners で遊んでいます。 いい感じに苦戦したのでメモ。

問題

C - Triangular Relationship

問題文

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

制約

  • 1 \leq N,K \leq 2×10^{5}
  •  N,Kは整数である

ACしたコード

using System;
using System.Linq;
using System.Collections.Generic;
using static System.Console;
using System.Text;
using System.IO;
using static System.Math;
namespace AtCoder
{
    class Program
    {
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        static void Main(string[] args)
        {
            var NK = Sarray();
            var N = NK[0];
            var K = NK[1];
            var ans = 0L;
            ans = (N / K) * (N / K) * (N / K);
            if (K % 2 == 0 && K / 2 <= N)
            {
                var sel = (N - K / 2) / K + 1;
                ans += sel * sel * sel;
            }
            WriteLine(ans);
        }
    }
}

考えたこと

aについて考えると*1


1 \leq a=\alpha_{1}K+\alpha_{0} \leq N \\
\hspace{50px}0 \leq \alpha_{1} \leq N/K  \\
\hspace{50px}0 \leq \alpha_{0} \lt K,

と書くことができる。ただし、 \alpha_1=0なら\alpha_0 \neq 0\alpha_1=N/Kなら\alpha_0 \leq N-(N/K)K

a+bについて考えると


a+b=(\alpha_{1}+\beta_{1})K+\alpha_{0}+\beta_{0}

  0  \leq  (\alpha_0+\beta_0) \lt 2K(\alpha_0+\beta_0) \mod K=0 なので、  \alpha_0+\beta_0=0 \, or \,  K

b+c,c+aについても同様に考えると \alpha_0=\beta_0=\gamma_0となるので、 \alpha_0= 0 \, or \, K/2 *2

条件を満たす組み合わせを考えると

\alpha_0=0のとき1 \leq \alpha_0\leq N/Kなので (N/K)^{3}通り

\alpha_{0}=K/2のとき0\leq \alpha_1\leq (N-K/2)/Kなので ( (N-K/2)/K+1)^{3}通り*3

その他

数式こねくり回さないでもちょいと条件ついけて全探索すればいけるようです

所感

解くのに1時間近くかかりましたが。こうやって書き出してみると簡単な問題な気がしてくる・・・

*1:めんどいのでb,cは略。それぞれ\beta,\gammaに読みかえる感じで

*2: \alpha_0=K/2とできるのはKが偶数の時のみ

*3:  0 \leq N-K/2 に注意