本文共 1667 字,大约阅读时间需要 5 分钟。
在本文中,我们将提供一个C++预处理脚本,它用于优化一个数学问题。这一脚本涉及到莫比乌斯函数和筛法,它在处理数论问题时表现出色。
#include#include
const int N = 2e5 + 10;const int M = 1e6 + 10;const int INF = 0x3f3f3f3f;const double eps = 1e-4;const int MOD = 1e9 + 7;
typedef long long ll;typedef pairPII;
ll prime[N], mu[N], k;ll F[N], ans[N];int n;bool is_prime[N];
ll get_sum(int x) { ll ans = 0; while (x) { ans += x % 10; x /= 10; } return ans;}
void init() { memset(is_prime, true, sizeof is_prime); mu[1] = 1; for (int i = 2; i < N; ++i) { if (is_prime[i]) { prime[++k] = i; mu[i] = -1; for (int j = 1; j <= k && i * prime[j] < N; ++j) { is_prime[i * prime[j]] = false; if (i % prime[j] == 0) { break; } else { mu[i * prime[j]] = -mu[i]; } } } } for (int i = 1; i <= n; ++i) { F[i] = get_sum(i); }}
void pre_process() { for (int t = 1; t <= n; ++t) { ll tmp = 0; for (int T = t; T <= n; T += t) { int l = T; int r = min(n, l + t - 1); tmp += F[l] * ((n / t) - (l / t) + 1); ans[l] += tmp * mu[t]; if (r + 1 <= n) { ans[r + 1] -= tmp * mu[t]; } } } for (int i = 1; i <= n; ++i) { ans[i] += ans[i-1]; }}
void solve() { cin >> n; init(); pre_process(); printf("%lld\n", ans[n]);}
这段代码用于解决一个数论问题,它利用了莫比乌斯函数和筛法预处理了答案。在实际应用中,这种预处理方法可以显著提高程序的效率,使其能够在短时间内处理大量数据。
转载地址:http://uqcoz.baihongyu.com/