比赛 EYOI暨SBOI暑假快乐赛6th 评测结果 AAAAAAAAAA
题目名称 秒速五厘米 最终得分 100
用户昵称 lihaoze 运行时间 0.251 s
代码语言 C++ 内存使用 25.38 MiB
提交时间 2022-06-30 11:44:28
显示代码纯文本
  1. #include <bits/stdc++.h>
  2.  
  3. using i64 = long long;
  4.  
  5. const int MOD = 1e9+7, N = 2e6+10;
  6. int n, m;
  7. i64 v[N], prime[N];
  8. std::map<i64, i64> fact;
  9.  
  10. i64 pow(i64 x, i64 power) {
  11. i64 ret = 1;
  12. for (; power; power >>= 1, x *= x)
  13. if (power & 1) ret *= x;
  14. return ret;
  15. }
  16.  
  17. void divide(i64 n) {
  18. memset(v, 0, sizeof v);
  19. m = 0;
  20. for (int i = 2; i <= n; ++ i) {
  21. if (v[i] == 0) v[i] = i, prime[++ m] = i;
  22. for (int j = 1; j <= m; ++ j) {
  23. if (prime[j] > v[i] || prime[j] > n / i) break;
  24. v[i * prime[j]] = prime[j];
  25. }
  26. }
  27. }
  28.  
  29. int main() {
  30. freopen("sakuras.in", "r", stdin);
  31. freopen("sakuras.out", "w", stdout);
  32. std::cin >> n;
  33. divide(n);
  34. for (int i = 1; i <= m; ++ i) {
  35. i64 power = 1, res = 0, now;
  36. while (now = n / pow(prime[i], power)) ++ power, res += now;
  37. fact[i] = res;
  38. }
  39. i64 ans = 1;
  40. for (auto [x, y] : fact) ans = ans % MOD * (2 * y % MOD + 1 % MOD) % MOD;
  41. std::cout << ans << '\n';
  42. return 0;
  43. }