fork download
  1. #include <cstdio>
  2. int n, m, k, v;
  3. int pr[200005], pn, pl[200005], bn, cnt[30005];
  4. long long d[30005 * 3]; //binary indexed tree
  5. long long X, Y;
  6. long long mul(int a, int b) {
  7. X = 1; Y = a;
  8. while (b) {
  9. if (b & 1) X = (X*Y) % m;
  10. Y *= Y; b /= 2;
  11. }
  12. return X;
  13. }
  14. void upd(int x, int y) {
  15. cnt[x] += y;
  16. d[bn + x] = mul(pr[x], cnt[x]);
  17. x += bn;
  18. x /= 2;
  19. while (x) {
  20. d[x] = (d[2 * x] * d[2 * x + 1]) % m;
  21. x /= 2;
  22. }
  23. }
  24. int main() {
  25. for (int i = 2; i <= 200000; i += 2) pl[i] = 1;
  26. pr[++pn] = 2;
  27. for (int i = 3; i <= 200000; i += 2) {
  28. if (!pl[i]) {
  29. pr[++pn] = i;
  30. for (int j = i; j <= 200000; j += i) pl[j] = pn;
  31. }
  32. }
  33. bn = 1;
  34. while (bn < pn) bn *= 2;
  35. bn--;
  36. for (int i = 1; i < 2 * (bn + 1); i++) d[i] = 1;
  37. scanf("%d%d", &n, &m);
  38. n -= 2;
  39. long long res = 1, s;
  40. for (int i = 2; i <= n; i++) {
  41. upd(1, 1);
  42. k = 2 * i - 1;
  43. while (k > 1) {
  44. v = pr[pl[k]];
  45. upd(pl[k], 1);
  46. k /= v;
  47. }
  48. k = i + 1;
  49. while (k > 1) {
  50. v = pr[pl[k]];
  51. upd(pl[k], -1);
  52. k /= v;
  53. }
  54. res += d[1];
  55. if (res >= m) res %= m;
  56. }
  57. printf("%lld", res);
  58. }
Success #stdin #stdout 0s 5724KB
stdin
5 100
stdout
8