// 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() |]
// vec tools
let transpose (m:'a [][]) = 
  let h,w = Array.length m, Array.length m.[0]
  [| for i in 0..w-1 -> [|0..h-1|] |> Array.map (fun j -> m.[j].[i]) |]


(* 場合分け
K が奇数の時、a, b, c を K で割ったあまりはすべて 0 である必要があります。K が偶数の時、a, b, c を
K で割ったあまりはすべて 0 であるか、あるいはすべて K/2 である必要があります。このような組の個数
は、N 以下で K で割って 0 あまるものの個数と K/2 あまるものの個数から求めることができるので、この
問題を解くことができました。
*)

(* 1..n で mod k が 0 となるモノの個数
  a0 = k, d =k な等差数列になるので (n/k) が解になる

 k/2 + (n-1) k <= N
 n-1 <= floor((N-k/2)/k
 n = 1+(N-k/2)/k
*)

let n,k = scan2 int
match k % 2 = 0 with
  | true -> (n/k)*(n/k)*(n/k) + (1+(n-k/2)/k)*(1+(n-k/2)/k)*(1+(n-k/2)/k)
  | false -> (n/k)*(n/k)*(n/k)
|> printfn "%d"