Problem:
Score : 300 points

Problem Statement

You are given integers N and K. Find the number of triples (a,b,c) of positive integers not greater than N such that a+b,b+c and c+a are all multiples of K.
The order of a,b,c does matter, and some of them can be the same.

Constraints

1 \leq N,K \leq 2\times 10^5

N and K are integers.

Input

Input is given from Standard Input in the following format:

N K

Output

Print the number of triples (a,b,c) of positive integers not greater than N such that a+b,b+c and c+a are all multiples of K.

Sample Input 1

3 2

Sample Output 1

9

(1,1,1),(1,1,3),(1,3,1),(1,3,3),(2,2,2),(3,1,1),(3,1,3),(3,3,1) and (3,3,3) satisfy the condition.

Sample Input 2

5 3

Sample Output 2

1

Sample Input 3

31415 9265

Sample Output 3

27

Sample Input 4

35897 932

Sample Output 4

114191

Solution in C# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.Collections.Generic;
using System.Linq;

namespace AtCoder
{
    class Program
    {
        static void Main(string[] args)
        {
            //[summary]B - Ruined Square
            var lines = ReadLines<int>(1).ToList();
            int n = lines[0][0];
            int k = lines[0][1];

            //Kの倍数を求める
            var multiple = GetNumbersDivislbleByK(n, k).ToList();

            //a,b,cの組み合わせを求める
            var abcPairs = GetAbcPairs(multiple, n).ToList();

            Console.WriteLine(abcPairs.Count);

            //foreach(var abc in abcPairs)
            //{
            //    Console.WriteLine(String.Join(" ", abc));
            //}
        }

        static IEnumerable<List<int>> GetAbcPairs(List<int> multiple, int n)
        {
            int a = 0;
            int b = 0;
            int c = 0;
            
            for(int i = 1; i <= n; i++)
            {
                a = i;

                for(int j = 0; j < multiple.Count; j++)
                {
                    b = multiple[j] - a;

                    if (b >= 1 && b <= n)
                    {
                        for (int k = 0; k < multiple.Count; k++)
                        {
                            c = multiple[k] - a;

                            if (c >= 1 && c <= n)
                            {
                                if (multiple.Count(x => x == (b + c)) == 1)
                                {
                                    var pairs = new List<int>() { a, b, c };
                                    yield return pairs;
                                }
                            }
                        }
                    }
                }
            }
        }

        static IEnumerable<int> GetNumbersDivislbleByK(int n, int k)
        {
            int i = 1;

            while (true)
            {
                if (k * i > n * 2)
                {
                    break;
                }
                else
                {
                    yield return k * i;
                    i++;
                }
            }
        }
                       
        static IEnumerable<List<T>> ReadLines<T>(int count = 0, char separator = ' ')
        {
            //[summary]コンソールの値を読み込んで、List<T>のコレクションを返却

            //読み込む行数が未指定のときは、1行目の値を"count"とみなす
            if (count == 0)
            {
                string line = Console.ReadLine().TrimEnd();
                count = int.Parse(line);
            }

            for (int i = 0; i < count; i++)
            {
                //コンソールを1行読み込み
                string line = Console.ReadLine().TrimEnd();

                //char型のときは1文字ずつに分割
                if (typeof(T) == typeof(char))
                {
                    var list = line.ToCharArray().ToList();
                    yield return (List<T>)(object)list;
                }
                else
                {
                    //読み込んだ値を"separator"で区切る
                    var list = line.Split(separator).ToList();

                    //int型のときは数値に変換
                    if (typeof(T) == typeof(int))
                    {
                        var numbers = list.ConvertAll(int.Parse);
                        yield return (List<T>)(object)numbers;
                    }
                    else
                    {
                        yield return (List<T>)(object)list;
                    }
                }
            }
        }
    }
}