// scan tuple
let scan1 f = stdin.ReadLine() |> f
let scan2 f = stdin.ReadLine().Split() |> Array.map f |> (fun a -> (a.[0], a.[1]))
let scan3 f = stdin.ReadLine().Split() |> Array.map f |> (fun a -> (a.[0], a.[1], a.[2]))
let scan4 f = stdin.ReadLine().Split() |> Array.map f |> (fun a -> (a.[0], a.[1], a.[2], a.[3]))
// scan vec and matrix (using Array)
let scanVecH f = stdin.ReadLine().Split() |> Array.map f
let scanVecV f n = [| for i in 1..n -> stdin.ReadLine() |> f |]
let scanMatrix f n = [| for i in 1..n -> stdin.ReadLine().Split() |> Array.map f |]
let scanCharMatrix n = [| for i in 1..n -> stdin.ReadLine().ToCharArray() |]

let n,k = scan2 int
(* 解説より
K が奇数の時、a, b, c を K で割ったあまりはすべて 0 である必要があります。
K が偶数の時、a, b, c を K で割ったあまりはすべて 0 であるか、あるいは
　　　　　　　                            すべて K/2 である必要があります。
このような組の個数は、
   N 以下で K で割って 0 あまるものの個数    と
                      K/2 あまるものの個数
から求めることができるので、この問題を解くことができました。 *)
match k % 2 = 1 with
  | true -> pown (n/k) 3
  | false -> (pown (n/k) 3) + (pown ((2*n+k)/(2*k)) 3) 
|> printfn "%d"