int main(){ vsip_init((void*)0); acos_f(); asin_f(); atan2_f(); atan_f(); cos_f(); sin_f(); sqrt_f(); tan_f(); ceil_f(); exp_f(); exp10_f(); floor_f(); fmod_f(); hypot_f(); log_f(); log10_f(); mag_f(); max_f(); min_f(); pow_f(); rsqrt_f(); sinh_f(); tanh_f(); cosh_f(); arg_f(); cadd_f(); cdiv_f(); cexp_f(); cjmul_f(); cmul_f(); clog_f(); cmag_f(); cmagsq_f(); cmplx_f(); cneg_f(); conj_f(); crecip_f(); csqrt_f(); csub_f(0); imag_f(); real_f(); polar_f(); rect_f(); vsip_finalize((void*)0); return 0; }
void main() { R = SqrRoot(m); int cnt = 0; for (long i = 1; m / i > R; ++i) basis[++cnt] = m / i; for (int i = R; i; --i) basis[++cnt] = i; // for (int i = 1; i <= cnt; ++i) { // if (get_index(basis[i]) != i) // print("!!! {} {}\n", get_index(basis[i]), i); // } for (int i = 1; i <= cnt; ++i) { num_primes[i] = basis[i] - 1; } // for (int i = 1; i < cnt; ++i) { // for (int v = basis[i + 1] + 1; v <= basis[i]; ++v) // if (v > R && ProbPrime(v)) // f[basis[i]] += 2; // } // f[1] = 1; // for (int i = cnt - 1; i; --i) { // f[basis[i]] += f[basis[i + 1]]; // // print("init {} = {}\n", basis[i], f[basis[i]]); // } // long ans = 0; // for (int i = 1; i <= m; ++i) { // ans += m / i; // } // print("bf = {}\n", ans); for (long x = 2; x <= R; ++x) { if (ProbPrime(x)) { print("current = {}\n", x); for (int i = 1; i <= cnt; ++i) { long y = basis[i]; if (x * x > y) break; auto a = num_primes[get_index(y / x)]; auto b = num_primes[get_index(x - 1)]; num_primes[i] -= a - b; } } } for (int i = 1; i <= cnt; ++i) { num_primes[i] %= MOD; // print("{} {}\n", basis[i], num_primes[i]); } for (int i = 1; i <= cnt; ++i) { f[i] = 1; // if (basis[i] >= R) { // f[i] += 2 * (num_primes[get_index(basis[i])] - num_primes[R]); // } // print("init {} {}\n", basis[i], f[i]); } for (long p = R; p; --p) { if (ProbPrime(p)) { print("current = {}\n", p); int t = p > n ? 0 : get_power(p, n); for (int e = 0; e <= 60; ++e) g[e] = (e + 1) * (t + 1) + t * (t + 1) / 2; for (int i = 1; i <= cnt; ++i) { long y = basis[i]; if (t == 0 && p * p > y) break; long v = 0; // 2 * (num_primes[get_index(y)] - num_primes[p]); for (int e = 0; y; ++e) { v += real_f(y, p) * g[e] % MOD; y /= p; } if (basis[i] >= p) v -= 2 * (num_primes[i] - num_primes[get_index(p)] + 1) % MOD; f[i] = (v + MOD) % MOD; // print("update {} = {}\n", basis[i], v); } } } print("ans = {}\n", real_f(m, 1)); }