using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); public static void Main() { Solve(); // Test(); } static void Test() { var r = new Random(); var count = 0; while (true) { var n = r.NextInt64(1_000_000_000_000_000_000) + 1; var k = r.NextInt64(Math.Min(1000, n)) + 1; var m = r.NextInt64(1_000_000_000_000) + 2; // 愚直解 var s1 = All(n, k, m); // 作成解 var s2 = Divide(n, k, m); if (s1 != s2) { WriteLine($"{n} {k} {m}"); // WriteLine(string.Join("\n", map.Select(m => string.Join(" ", m)))); WriteLine(s1); WriteLine(s2); return; } ++count; if (count % 1000 == 0) WriteLine(count); } } static long All(long n, long k, long m) { var ans = 0L; for (var i = n - k + 1; i <= n; ++i) { var tmp = i; while (tmp % m == 0) { ++ans; tmp /= m; } } for (var i = 1L; i <= k; ++i) { var tmp = i; while (tmp % m == 0) { --ans; tmp /= m; } } return ans; } static void Solve() { var c = NList; var (n, k, m) = (c[0], c[1], c[2]); WriteLine(Divide(n, k, m)); } static long Divide(long n, long k, long m) { return Divs(n, m) - Divs(n - k, m) - Divs(k, m); } static long Divs(long n, long p) { if (n < 0) return 0; var prev = 1L; var ans = 0L; while (true) { var pc = prev * p; if (pc / p != prev) break; ans += n / pc; prev = pc; } return ans; } }