int n, m, k; int part[N], tot; int pri[M], vis[M], tt; int mu[M]; int qaq[M];
voidinit1(){ part[++tot] = mu[1] = 1; qaq[1] = 1; for (int i = 2; i <= k; ++i) { if (k % i == 0) part[++tot] = i, qaq[i] = tot; if (!vis[i]) { mu[i] = -1; pri[++tt] = i; } for (int j = 1; j <= tot && i * pri[j] <= k; ++j) { vis[i * pri[j]] = 1; if (i % pri[j] == 0) { mu[i * pri[j]] = 0; break; } mu[i * pri[j]] = -mu[i]; } } for (int i = 1; i <= k; ++i) mu[i] = mu[i - 1] + (k % i == 0) * mu[i]; }
int f[N / 2][N]; std::vector<std::pair<int, int> > mul[N];
longlongcalc(int x){ longlong ret = 0; for (int l = 1, r; l <= x; l = r + 1) { r = x / (x / l); ret += (mu[std::min(k, r)] - mu[std::min(k, l - 1)]) * (x / l); } return ret % P; }
voidinit2(){ for (int i = 1; i <= tot; ++i) { if (m / part[i] == 0) break; f[1][i] = calc(m / part[i]); } for (int i = 1; i <= tot; ++i) for (int j = 1; j <= tot; ++j) { if ((longlong)part[i] * part[j] > k) break; int qwq = part[i] * part[j]; if (qaq[qwq]) mul[qaq[qwq]].push_back({ i, j }); } }
voidsolve(){ for (int i = 2; i <= n; ++i) for (int j = 1; j <= tot; ++j) { longlong sum = 0; for (auto y : mul[j]) { sum += f[i - 1][y.first] * f[1][y.second]; } f[i][j] = (f[i][j] + sum) % P; }
std::cout << f[n][tot] << std::endl; }
intmain(){ std::cin >> n >> m >> k; init1(); init2(); solve(); return0; }