min_25 推导及例题总结

min_25 筛

一个亚线性筛,复杂度大概是O(n34log⁡n)O(\frac{n ^{\frac{3}{4}}}{ \log n})O(lognn43)

使用min_25min\_25min_25求前缀和,有两个基本特征:① 积性函数,② 满足质数点为多项式。

算法思路

给定n≤1011n \leq 10 ^ {11}n1011,设f(n)f(n)f(n)为一个积性函数,质数点为多项式,求∑i=1nf(i)\sum\limits_{i = 1} ^{n} f(i)i=1nf(i)

  • 先求出n\sqrt nn内的所有质数,以及f(i)f(i)f(i)

  • 求出∑i=1n[i∈prime]f(i)\sum\limits_{i = 1} ^{n} [i \in prime]f(i)i=1n[iprime]f(i)pip_ipi为第iii个质因子。

    我们设g(n,j)=∑i=1n[i∈primeormin_prime_of_i>pj]f(i)g(n, j) = \sum\limits_{i = 1} ^{n}[i \in prime\ or\ min\_prime\_of\_i > p_j]f(i)g(n,j)=i=1n[iprime or min_prime_of_i>pj]f(i),质数或者最小质因子大于pjp_jpjfff值之和。

    考虑从g(n,i−1)g(n, i - 1)g(n,i1)推到g(n,i)g(n, i)g(n,i),我们也就是要减去最小质因子等于pip_ipi的贡献,
    g(n,i)={g(n,i−1)pi×pi>ng(n,i−1)−f(pi)×(g(npi,i−1)−∑j=1i−1f(pj))pi×pi≤ng(n, i) = \left\{\begin{matrix}\\ g(n, i - 1)& p_i \times p_i > n\\ g(n, i - 1) - f(p_i) \times \left(g(\frac{n}{p_i}, i - 1) - \sum\limits_{j = 1} ^{i - 1}f(p_j) \right) & p_i \times p_i \leq n\\ \end{matrix}\right. g(n,i)=g(n,i1)g(n,i1)f(pi)×(g(pin,i1)j=1i1f(pj))pi×pi>npi×pin

  • 考虑如何递归计算积性函数前缀和∑i=1nf(i)\sum\limits_{i = 1} ^{n} f(i)i=1nf(i)

    S(n,j)=∑i=1n[min_prime_of_i≥pj]f(i)S(n, j) = \sum\limits_{i = 1} ^{n} [min\_prime\_of\_i \geq p_j] f(i)S(n,j)=i=1n[min_prime_of_ipj]f(i),最小质因子大于等于pjp_jpjfff值之和,所以这个积性函数的前缀和即为S(n,1)+f(1)S(n, 1) + f(1)S(n,1)+f(1)

    对于S(n,j)S(n, j)S(n,j),中质数的贡献我们是已知的S(n,j)=∑i=1n[i∈prime]f(i)−∑i=1j−1f(pi)S(n, j) = \sum\limits_{i = 1} ^{n}[i \in prime]f(i) - \sum\limits_{i = 1} ^{j - 1} f(p_i)S(n,j)=i=1n[iprime]f(i)i=1j1f(pi),接下来考虑计算合数对答案的贡献。

    我们枚举合数的最小质因子以及最小质因子的次幂,考虑从S(n,j+1)S(n, j + 1)S(n,j+1)推到S(n,j)S(n, j)S(n,j),也就是在原来的基础上加上,
    ∑i=jprimei×primei≤n∑k=1primeik+1≤n(S(nprimeik,j+1)f(primeik)+f(primeik+1))\sum_{i = j} ^{prime_i \times prime_i \leq n} \sum_{k = 1} ^{prime_i ^ {k + 1} \leq n} \left(S(\frac{n}{prime_i ^ k}, j + 1)f(prime_i ^ k) + f(prime_i ^ {k + 1})\right)\\ i=jprimei×primeink=1primeik+1n(S(primeikn,j+1)f(primeik)+f(primeik+1))
    所以有
    S(n,j)=g(n)−∑i=1j−1f(pi)+∑i=jprimei×primei≤n∑k=1primeik+1≤n(S(nprimeik,j+1)f(primeik)+f(primeik+1))S(n, j) = g(n) - \sum_{i = 1} ^{j - 1} f(p_i) +\sum_{i = j} ^{prime_i \times prime_i \leq n} \sum_{k = 1} ^{prime_i ^ {k + 1} \leq n} \left(S(\frac{n}{prime_i ^ k}, j + 1)f(prime_i ^ k) + f(prime_i ^ {k + 1})\right)\\ S(n,j)=g(n)i=1j1f(pi)+i=jprimei×primeink=1primeik+1n(S(primeikn,j+1)f(primeik)+f(primeik+1))
    这里的g(n)g(n)g(n)是最后筛得的,也就是里面存的是质数fff的前缀和。

    这里解释一下那后面一长串的东西,为什么要加上f(primeik+1)f(prime_i ^{k + 1})f(primeik+1),而且上界为primeik+1≤nprime_i ^{k + 1} \leq nprimeik+1n

    由于我们枚举的是最小质因子及幂次,那么一定有n>primeikn > prime_i ^ kn>primeik,所以有上界为primeik+1≤nprime_i ^{k + 1} \leq nprimeik+1n

    至于为什么要加上f(primeik+1)f(prime_i ^ {k + 1})f(primeik+1),由于我们定义的函数中f(1)f(1)f(1)在执行min_25min\_25min_25的过程中始终为000

    当我们枚举的幂次为k+1k + 1k+1时,我们会漏了f(primeik+1)f(prime_i ^{k + 1})f(primeik+1)这一项,所以得在前一步给他加上去。

  • 优化一点点?如何递推计算积性函数前缀和∑i=1nf(i)\sum\limits_{i = 1} ^{n} f(i)i=1nf(i)

    不就是把上面的S(n,j)S(n, j)S(n,j),从S(n,j+1)S(n, j + 1)S(n,j+1)一步一步往下推吗?

    对于nprimejk≥primej,nprimejk<primej+12\frac{n}{prime_j ^ k} \geq prime_j, \frac{n}{prime_j ^ k} < prime_{j + 1} ^ 2primejknprimej,primejkn<primej+12,这一步,中我们递归会返回的是g(n)−∑i=1jf(pi)g(n) - \sum\limits_{i = 1} ^{j}f(p_i)g(n)i=1jf(pi)

    也就是大于primejprime_jprimej的质数的部分,按照S(n,j)S(n, j)S(n,j)的定义,我们在递推的时候,得到的却是000

    所以我们修改一下递推时候的S(n,j)S(n, j)S(n,j)的定义:设S(n,j)=∑i=1n[i∈primeormin_prime_of_i≥pj]f(i)S(n, j) = \sum\limits_{i = 1} ^{n}[i \in prime\ or\ min\_prime\_of\_i \geq p_j]f(i)S(n,j)=i=1n[iprime or min_prime_of_ipj]f(i)

    我们还是同样的枚举最小质因子,及其次幂,考虑从S(n,j+1)S(n, j + 1)S(n,j+1)推到S(n,j)S(n, j)S(n,j),也就是要加上
    ∑i=jprimei×primei≤n∑k=1primeik+1≤n((S(nprimeik,j+1)−∑k=1jf(pi))f(primeik)+f(primeik+1))\sum_{i = j} ^{prime_i \times prime_i \leq n} \sum_{k = 1} ^{prime_i ^{k + 1} \leq n} \left(\left(S(\frac{n}{prime_i ^ k}, j + 1) - \sum_{k = 1} ^{j} f(p_i) \right)f(prime_i ^ k) + f(prime_i ^{k + 1})\right)\\ i=jprimei×primeink=1primeik+1n((S(primeikn,j+1)k=1jf(pi))f(primeik)+f(primeik+1))

P5325 【模板】Min_25筛

有积性函数f(x)f(x)f(x),且f(pk)=pk(pk−1),p∈primesf(p ^ k) = p ^ k(p ^ k - 1), p \in primesf(pk)=pk(pk1),pprimes,求∑i=1nf(i)\sum\limits_{i = 1} ^{n} f(i)i=1nf(i)

#include <bits/stdc++.h>using namespace std;namespace min_25 {const int N = 1e6 + 10, mod = 1e9 + 7, inv2 = 500000004, inv6 = 166666668;int prime[N], id1[N], id2[N], m, T, cnt;long long a[N], sum1[N], g1[N], sum2[N], g2[N], s[N], n;bool st[N];inline int ID(long long x) {return x <= T ? id1[x] : id2[n / x];}inline long long f(long long x) {x %= mod;return x * (x - 1) % mod;}inline long long calc1(long long x) {x %= mod;return (x * (x + 1) % mod * (2 * x + 1) % mod * inv6 % mod - 1 + mod) % mod;}inline long long calc2(long long x) {x %= mod;return (x * (x + 1) % mod * inv2 % mod - 1 + mod) % mod;}void init() {T = sqrt(n + 0.5);for(int i = 2; i <= T; i++) {if(!st[i]) {prime[++cnt] = i;sum1[cnt] = (sum1[cnt - 1] + 1ll * i * i) % mod;sum2[cnt] = (sum2[cnt - 1] + i) % mod;}for(int j = 1; j <= cnt && 1ll * i * prime[j] <= T; j++) {st[i * prime[j]] = 1;if(i % prime[j] == 0) {break;}}}for (long long l = 1, r; l <= n; l = r + 1) {r = n / (n / l);a[++m] = n / l;a[m] <= T ? id1[a[m]] = m : id2[n / a[m]] = m;g1[m] = calc1(a[m]);g2[m] = calc2(a[m]);}for (int j = 1; j <= cnt && 1ll * prime[j] * prime[j] <= n; j++) {for (int i = 1; i <= m && 1ll * prime[j] * prime[j] <= a[i]; i++) {g1[i] = ((g1[i] - 1ll * prime[j] * prime[j] % mod * (g1[ID(a[i] / prime[j])] - sum1[j - 1]) % mod) % mod + mod) % mod;g2[i] = ((g2[i] - 1ll * prime[j] * (g2[ID(a[i] / prime[j])] - sum2[j - 1]) % mod) % mod + mod) % mod;}}for (int i = 1; i <= m; i++) {s[i] = (g1[i] - g2[i] + mod) % mod;}for (int j = cnt; j >= 1; j--) {for (int i = 1; i <= m && 1ll * prime[j] * prime[j] <= a[i]; i++) {for (long long cur = prime[j]; cur * prime[j] <= a[i]; cur *= prime[j]) {s[i] = (s[i] + f(cur % mod) * (s[ID(a[i] / cur)] - sum1[j] + sum2[j]) % mod + f(cur * prime[j])) % mod;s[i] = (s[i] + mod) % mod;}}}printf("%lld\n", s[ID(n)] + 1);}}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%lld", &min_25::n);min_25::init();return 0;
}

#6235. 区间素数个数

直接是min_25min\_25min_25ggg函数求解。

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e6 + 10;int prime[N], id1[N], id2[N], m, cnt, T;bool st[N];ll a[N], sum[N], g[N], n;inline int ID(ll x) {return x <= T ? id1[x] : id2[n / x];
}void init() {T = sqrt(n + 0.5);for (int i = 2; i <= T; i++) {if (!st[i]) {prime[++cnt] = i;sum[cnt] = sum[cnt - 1] + 1;}for (int j = 1; j <= cnt && 1ll * i * prime[j] <= T; j++) {st[i * prime[j]] = 1;if (i % prime[j] == 0) {break;}}}for (ll l = 1, r; l <= n; l = r + 1) {r = n / (n / l);a[++m] = n / l;if (a[m] <= T) {id1[a[m]] = m;}else {id2[n / a[m]] = m;}g[m] = a[m] - 1;}for (int j = 1; j <= cnt && 1ll * prime[j] * prime[j] <= n; j++) {for (int i = 1; i <= m && 1ll * prime[j] * prime[j] <= a[i]; i++) {g[i] -= g[ID(a[i] / prime[j])] - sum[j - 1];}}
}ll solve(ll n) {return g[ID(n)];
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%lld", &n);init();printf("%lld\n", solve(n));return 0;
}

#572. 「LibreOJ Round #11」Misaka Network 与求和

f(n)f(n)f(n)为次大质因子,f(6)=3,f(4)=2,f(1)=0,f(p)=1f(6) = 3, f(4) = 2, f(1) = 0, f(p) = 1f(6)=3,f(4)=2,f(1)=0,f(p)=1
∑i=1n∑j=1nf(gcd⁡(i,j))k∑d=1nf(d)k∑i=1n∑j=1n[gcd(i,j)=d]∑d=1nf(d)k∑i=1nd∑j=1nd[gcd(i,j)=1]∑d=1nf(d)k(2×∑i=1nd∑j=1i[gcd(i,j)=1]−1)∑d=1nf(d)k(2∑i=1ndϕ(i)−1)\sum_{i = 1} ^{n} \sum_{j = 1} ^{n} f(\gcd(i, j)) ^ k\\ \sum_{d = 1} ^{n} f(d) ^ k \sum_{i = 1} ^{n} \sum_{j = 1} ^{n}[gcd(i, j) = d]\\ \sum_{d = 1} ^{n} f(d) ^ k \sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{\frac{n}{d}}[gcd(i, j) = 1]\\ \sum_{d = 1} ^{n} f(d) ^ k \left( 2 \times\sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{i}[gcd(i, j) = 1] - 1 \right)\\ \sum_{d = 1} ^{n} f(d) ^ k \left(2 \sum_{i = 1} ^{\frac{n}{d}}\phi(i) - 1\right)\\ i=1nj=1nf(gcd(i,j))kd=1nf(d)ki=1nj=1n[gcd(i,j)=d]d=1nf(d)ki=1dnj=1dn[gcd(i,j)=1]d=1nf(d)k2×i=1dnj=1i[gcd(i,j)=1]1d=1nf(d)k2i=1dnϕ(i)1
S(n)=∑i=1nϕ(i),F(n)=f(n)kS(n) = \sum\limits_{i = 1} ^{n} \phi(i), F(n) = f(n) ^ kS(n)=i=1nϕ(i),F(n)=f(n)k,而有:
∑d=1nF(d)(2×S(nd)−1)\sum_{d = 1} ^{n} F(d) \left(2 \times S(\frac{n}{d}) - 1 \right)\\ d=1nF(d)(2×S(dn)1)
对于2×S(nd)−12 \times S(\frac{n}{d}) - 12×S(dn)1,可以通过杜教筛求得,考虑如何求前面的∑i=1nF(i)\sum\limits_{i = 1} ^{n} F(i)i=1nF(i),对前项考虑min_25min\_25min_25求解。

我们定义S(n,j)=∑i=1n[i∈primeormin_primeofi≥primej]f(i)S(n, j) = \sum\limits_{i = 1} ^{n} [i \in prime\ or\ min\_prime\ of\ i \geq prime_j] f(i)S(n,j)=i=1n[iprime or min_prime of iprimej]f(i),也就是质数或者,最小质因子大于等于primejprime_jprimej的答案。

每一轮我们枚举最小质因子及其幂次,考虑这一部分合数的贡献,分两种:

  • primejprime_jprimej是次小质因子。
  • primejprime_jprimej不是次小质因子。
#include <bits/stdc++.h>using namespace std;typedef unsigned int uint;uint quick_pow(uint a, int n) {uint ans = 1;while (n) {if (n & 1) {ans *= a;}a *= a;n >>= 1;}return ans;
}int n, k;namespace min_25 {const int N = 1e6 + 10;int prime[N], a[N], id1[N], id2[N], m, cnt, T;uint g[N], sum[N], s[N], f[N];bool st[N];inline int ID(int x) {return x <= T ? id1[x] : id2[n / x];}void init() {T = sqrt(n + 0.5);for(int i = 2; i <= T; i++) {if(!st[i]) {prime[++cnt] = i;f[cnt] = quick_pow(i, k);sum[cnt] = sum[cnt - 1] + 1;}for(int j = 1; j <= cnt && 1ll * i * prime[j] <= T; j++) {st[i * prime[j]] = 1;if(i % prime[j] == 0) {break;}}}for(int l = 1, r; l <= n; l = r + 1) {r = n / (n / l);a[++m] = n / l;a[m] <= T ? id1[a[m]] = m : id2[n / a[m]] = m;g[m] = a[m] - 1;}for(int j = 1; j <= cnt; j++) {for(int i = 1; i <= m && 1ll * prime[j] * prime[j] <= a[i]; i++) {g[i] -= g[ID(a[i] / prime[j])] - sum[j - 1];}}for (int i = 1; i <= m; i++) {s[i] = g[i];}for (int j = cnt; j >= 1; j--) {for (int i = 1; i <= m && 1ll * prime[j] * prime[j] <= a[i]; i++) {for (int cur = prime[j]; 1ll * cur * prime[j] <= a[i]; cur *= prime[j]) {s[i] += (s[ID(a[i] / cur)] - g[ID(a[i] / cur)]) + (g[ID(a[i] / cur)] - sum[j - 1]) * f[j];/*合数答案贡献分为两类:一、当前枚举的质数不是次小的,二、当前枚举的质数是次小的,也就是形如prime[j] ^ k * b, b是一个质数且这个质数大于 prime[j], 最后再加上 f(prime[j] ^ {k + 1})。*/}}}}uint solve(int x) {return x <= 1 ? 0 : s[ID(x)];}
}namespace Djs {const int N = 2e6 + 10;int prime[N], cnt;uint phi[N];bool st[N];void init() {phi[1] = 1;for (int i = 2; i < N; i++) {if (!st[i]) {prime[++cnt] = i;phi[i] = i - 1;}for (int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) {st[i * prime[j]] = 1;if (i % prime[j] == 0) {phi[i * prime[j]] = phi[i] * prime[j];break;}phi[i * prime[j]] = phi[i] * (prime[j] - 1);}}for (int i = 1; i < N; i++) {phi[i] += phi[i - 1];}}unordered_map<int, uint> mp;uint Djs_ans(int n) {if (n < N) {return phi[n];}if (mp.count(n)) {return mp[n];}uint ans = 1ll * n * (n + 1) / 2;for (uint l = 2, r; l <= n; l = r + 1) {r = n / (n / l);ans -= (r - l + 1) * Djs_ans(n / l);}return mp[n] = ans;}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &k);min_25::init();Djs::init();uint ans = 0;for (uint l = 1, r; l <= n; l = r + 1) {r = n / (n / l);ans += (min_25::solve(r) - min_25::solve(l - 1)) * (2 * Djs::Djs_ans(n / l) - 1);}cout << ans << "\n";return 0;
}

1847 奇怪的数学题

给定n,kn, kn,k,要我们求∑i=1n∑j=1nsgcd(i,j)k\sum\limits_{i = 1} ^{n} \sum\limits_{j = 1} ^{n}sgcd(i, j) ^ ki=1nj=1nsgcd(i,j)ksgcd(i,j)sgcd(i, j)sgcd(i,j)gcd(i,j)gcd(i, j)gcd(i,j)的次大公约数,sgcd(i,j)=gcd⁡(i,j)min_primeofgcd⁡(i,j)sgcd(i, j) = \frac{\gcd(i, j)}{min\_prime\ of\ \gcd(i, j)}sgcd(i,j)=min_prime of gcd(i,j)gcd(i,j),另sgcd(i,j)=f(gcd(i,j))sgcd(i, j) = f(gcd(i, j))sgcd(i,j)=f(gcd(i,j))
∑i=1n∑j=1nf(gcd(i,j))k∑d=1nf(d)k∑i=1n∑j=1n[gcd(i,j)=d]∑d=1nf(d)k∑i=1nd∑j=1nd[gcd(i,j)=1]∑d=1nf(d)k(2×∑i=1nd∑j=1i[gcd(i,j)=1]−1)∑d=1nf(d)k(2×∑i=1ndϕ(i)−1)\sum_{i = 1} ^{n} \sum_{j = 1} ^{n} f(gcd(i, j)) ^ k\\ \sum_{d = 1} ^{n} f(d) ^ k \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} [gcd(i, j) = d]\\ \sum_{d = 1} ^{n} f(d) ^ k \sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{\frac{n}{d}}[gcd(i,j) = 1]\\ \sum_{d = 1} ^{n} f(d) ^ k \left(2 \times \sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{i} [gcd(i, j) = 1] - 1\right)\\ \sum_{d = 1} ^{n} f(d) ^ k \left(2 \times \sum_{i = 1} ^{\frac{n}{d}} \phi(i) -1 \right)\\ i=1nj=1nf(gcd(i,j))kd=1nf(d)ki=1nj=1n[gcd(i,j)=d]d=1nf(d)ki=1dnj=1dn[gcd(i,j)=1]d=1nf(d)k2×i=1dnj=1i[gcd(i,j)=1]1d=1nf(d)k2×i=1dnϕ(i)1
后项可以用杜教筛求解,考虑前项的∑d=1nf(d)k\sum\limits_{d = 1} ^{n} f(d) ^ kd=1nf(d)kmin_25min\_25min_25中有枚举最小质因子的一步,下面定义f(n)=nkf(n) = n ^ kf(n)=nk

还记得g(n,j)=g(n,j−1)−f(pj)(g(npj)−∑i=1j−1pj)g(n, j) = g(n, j - 1) - f(p_j) \left(g(\frac{n}{p_j}) - \sum\limits_{i = 1} ^{j - 1} p_j \right)g(n,j)=g(n,j1)f(pj)(g(pjn)i=1j1pj),的转移

后面减去的不就是最小质因子等于pjp_jpj且为合数的函数值,那么g(npj−∑i=1j−1pj)g(\frac{n}{p_j} - \sum\limits_{i = 1} ^{j - 1}p_j)g(pjni=1j1pj)就是除去f(pj)f(p_j)f(pj)的,也就是我们需要的sgcdsgcdsgcd了。

#include <bits/stdc++.h>using namespace std;typedef unsigned int uint;const int N = 1e6 + 10;uint quick_pow(uint a, int n) {uint ans = 1;while(n) {if(n & 1) ans = ans * a;a = a * a;n >>= 1;}return ans;
}namespace Sum {uint S[60][60], k;uint Sumk(int n) {uint ret = 0;for(int i = 1; i <= k; ++i) {uint s = 1;for(int j = 0; j <= i; ++j)if((n + 1 - j) % (i + 1)) s *= n + 1 - j;else s *= (n + 1 - j) / (i + 1);ret += S[k][i] *s;}return ret;}void init() {S[0][0] = 1;for(int i = 1; i <= k; i++)for(int j = 1; j <= i; j++)S[i][j] = S[i-1][j-1] + j * S[i-1][j];}     
}namespace Min_25 {uint prime[N], id1[N], id2[N], m, cnt, k, T;uint a[N], g1[N], sum1[N], g2[N], sum2[N], f[N], ans[N], n;bool st[N];int ID(int x) {return x <= T ? id1[x] : id2[n / x];}void init() {T = sqrt(n + 0.5);for(int i = 2; i <= T; i++) {if(!st[i]) {prime[++cnt] = i;sum1[cnt] = sum1[cnt - 1] + 1;f[cnt] = quick_pow(i, k);sum2[cnt] = sum2[cnt - 1] + f[cnt];}for(int j = 1; j <= cnt && 1ll * i * prime[j] <= T; j++) {st[i * prime[j]] = 1;if(i % prime[j] == 0) {break;}}}for(int l = 1, r; l <= n; l = r + 1) {r = n / (n / l);a[++m] = n / l;if(a[m] <= T) id1[a[m]] = m;else id2[n / a[m]] = m;g1[m] = a[m] - 1;g2[m] = Sum::Sumk(a[m]) - 1;}for(int j = 1; j <= cnt; j++) {for(int i = 1; i <= m && 1ll * prime[j] * prime[j] <= a[i]; i++) {g1[i] -= (g1[ID(a[i] / prime[j])] - sum1[j - 1]);g2[i] -= f[j] * (g2[ID(a[i] / prime[j])] - sum2[j - 1]);ans[i] += g2[ID(a[i] / prime[j])] - sum2[j - 1];}}for(int i = 1; i <= m; i++) {ans[i] += g1[i];}}uint solve(int x) {if(x <= 1) return 0;return ans[ID(x)];}
}namespace Djs {uint prime[N], phi[N], cnt;bool st[N];void init() {phi[1] = 1;for(int i = 2; i < N; i++) {if(!st[i]) {prime[++cnt] = i;phi[i] = i - 1;}for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) {st[i * prime[j]] = 1;if(i % prime[j] == 0) {phi[i * prime[j]] = phi[i] * prime[j];break;}phi[i * prime[j]] = phi[i] * (prime[j] - 1);}}for(int i = 1; i < N; i++) {phi[i] += phi[i - 1];}}unordered_map<int, uint> ans_s;uint S(int n) {if(n < N) return phi[n];if(ans_s.count(n)) return ans_s[n];uint ans = 1ll * n * (n + 1) / 2;for(uint l = 2, r; l <= n; l = r + 1) {r = n / (n / l);ans -=(r - l + 1) * S(n / l);}return ans_s[n] = ans;}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);int n, k;cin >> n >> k;Sum::k = k;Sum::init();Djs::init();Min_25::n = n, Min_25::k = k;Min_25::init();uint ans = 0;for(uint l = 1, r; l <= n; l = r + 1) {r = n / (n / l);ans += (Min_25::solve(r) - Min_25::solve(l - 1)) * (2 * Djs::S(n / l) - 1);}cout << ans << "\n";return 0;
}

这是第二次学min_25了,第一次学的时候只会打打模板,理解的不是很深,希望这次我是真的理解了吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core 使用 signalR(一)

asp.net core 使用 signalR&#xff08;一&#xff09;IntroSignalR 是什么&#xff1f;ASP.NET Core SignalR 是一个开源代码库&#xff0c;它简化了向应用添加实时 Web 功能的过程。实时 Web 功能使服务器端代码能够即时将内容推送到客户端。SignalR 的适用对象&#xff1a;需…

深入理解 JVM Class文件格式(二)

** class文件中的特殊字符串 ** 特殊字符串是常量池中符号引用的一部分&#xff0c;包括三种&#xff1a; 类的全限定名&#xff0c; 字段和方法的描述符&#xff0c; 特殊方法的方法名。 下面我们就分别介绍这三种特殊字符串。 &#xff08;1&#xff09; 类的全限定名 在…

P4211 [LNOI2014]LCA(离线 + 在线 做法)

P4211 [LNOI2014]LCA 有一棵根节点为111树&#xff0c;有mmm次询问&#xff0c;每次给定l,r,zl, r, zl,r,z&#xff0c;输出∑ilrdep[lca(i,z)]\sum\limits_{i l} ^{r} dep[lca(i, z)]il∑r​dep[lca(i,z)]。 乍一看这题好像无从下手&#xff0c;仔细想想lca(i,z)lca(i, z)l…

.NET框架之“小马过河”

.NET框架之“小马过河”有许多流行的 .NET框架&#xff0c;大家都觉得挺“重”&#xff0c;认为很麻烦&#xff0c;重量级&#xff0c;不如其它“轻量级”框架&#xff0c;从而不愿意使用。面对形形色色的框架发愁&#xff0c;笔者也曾发愁。但我发现只要敢于尝试&#xff0c;这…

深入理解 JVM Class文件格式(三)

** JVM常量池中各数据项类型详解 ** 关于常量池的大概内容&#xff0c; 已经在 深入理解 JVM Class文件格式&#xff08;一&#xff09; 中讲解过了&#xff0c; 这篇文章中还介绍了常量池中的11种数据类型。 本文的任务是详细讲解这11种数据类型&#xff0c; 深度剖析源文件…

#6073. 「2017 山东一轮集训 Day5」距离(树链剖分 + 永久标记主席树)

#6073. 「2017 山东一轮集训 Day5」距离 给定一颗有nnn个节点带边权的树&#xff0c;以及一个排列ppp&#xff0c;path(u,v)path(u, v)path(u,v)为u,vu, vu,v路径上的点集&#xff0c;dist(u,v)dist(u, v)dist(u,v)为u,vu, vu,v之间的最短路的长度。 有mmm次询问&#xff0c;…

ML.NET 示例:搜索引擎结果排名

ML.NET 示例中文版&#xff1a;https://github.com/feiyun0112/machinelearning-samples.zh-cn/edit/master/samples/csharp/getting-started/Ranking_Web英文原版请访问&#xff1a;https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-st…

深入理解 JVM Class文件格式(四)

&#xff08;3&#xff09;CONSTANT_Integer_info 一个常量池中的CONSTANT_Integer_info数据项, 可以看做是CONSTANT_Integer类型的一个实例。 它存储的是源文件中出现的int型数据的值。 同样&#xff0c; 作为常量池中的一种数据类型&#xff0c; 它的第一个字节也是一个tag值…

.Net Core中使用Quartz.Net Vue开即用的UI管理

Quartz.NETQuartz.Net 定制UI维护了常用作业添加、删除、修改、停止、启动功能&#xff0c;直接使用cron表达式设置作业执行间隔&#xff0c;有完整的日志记录。Quartz.NET是一个功能齐全的开源作业调度系统&#xff0c;可用于从最小的应用程序到大型企业系统。Quartz.NET是一个…

Ancient Distance(妙啊!!!) [2020牛客暑期多校训练营(第四场)]

Ancient Distance 给定一颗根为111有nnn个节点的树&#xff0c;每次可以选定树上kkk节点当作特殊节点&#xff0c; 定义dis(u)dis(u)dis(u)为&#xff0c;从u−>1u->1u−>1遇上的第一个特殊点的距离&#xff0c;如果遇不上特殊点则dis(u)dis(u)dis(u)无穷大。 有nn…

深入理解 JVM Class文件格式(五)

&#xff08;8&#xff09; CONSTANT_Class_info 常量池中的一个CONSTANT_Class_info&#xff0c; 可以看做是CONSTANT_Class数据类型的一个实例。 他是对类或者接口的符号引用。 它描述的可以是当前类型的信息&#xff0c; 也可以描述对当前类的引用&#xff0c; 还可以描述对…

混沌工程详细介绍——Netflix持续交付实践探寻

内容来源&#xff1a;DevOps案例深度研究 – Netflix的文化与工程实践战队&#xff08;本文只展示部分案例PPT及研究成果&#xff0c;更多细节请关注案例分享活动&#xff0c;及本公众号&#xff09;。本案例内容贡献者&#xff1a;高金梅&#xff0c;李晓莉&#xff0c;潘雄鹰…

P4175 [CTSC2008]网络管理(整体二分)

P4175 [CTSC2008]网络管理 给定一棵有nnn个节点的树&#xff0c;点有点权&#xff0c;有两种操作&#xff1a;① 修改某个点的点权&#xff0c;② 查询两点路径间的点权第kkk大。 给定u,vu, vu,v&#xff0c;选定111号节点为根节点&#xff0c;设inf(x)inf(x)inf(x)表示从根节…

深入理解 JVM Class文件格式(六)

经过前几篇文章&#xff0c; 终于将常量池介绍完了&#xff0c; 之所以花这么大的功夫介绍常量池&#xff0c; 是因为对于理解class文件格式&#xff0c;常量池是必须要了解的&#xff0c; 因为class文件中其他地方&#xff0c;大量引用了常量池中的数据项。 对于还不了解常量池…

远程开发初探 - VS Code Remote Development

如果你是学生&#xff0c;你还在你的 windows 电脑上为各种环境配置头疼的时候&#xff0c;你应该了解一下 Remote Development。如果你喜欢 linux 的开发环境和舒适的 shell&#xff0c;但却不舍得抛弃 windows/macos 图形界面给你带来的用户体验和一些软件的兼容(QQ, 微信), …

深入理解 JVM Class文件格式(七)

本专栏列前面的一系列博客&#xff0c; 对Class文件中的一部分数据项进行了介绍。 本文将会继续介绍class文件中未讲解的信息。 先回顾一下上面一篇文章。 在上一篇博客中&#xff0c; 我们介绍了&#xff1a; this_class 对当前类的描述 super_class 对当前类的超类的描述 in…

P3250 [HNOI2016]网络(整体二分)

P3250 [HNOI2016]网络 给定一棵树&#xff0c;有三种操作&#xff1a; 给定u,v,wu, v, wu,v,w&#xff0c;表示u,vu, vu,v路径上有一个重要度为www的请求&#xff0c;给定ttt&#xff0c;第ttt个发生的请求结束&#xff0c;给定一个xxx&#xff0c;假设xxx发生故障&#xff0…

微信小程序集成腾讯云 IM SDK

1、背景因业务功能需求需要接入IM&#xff08;即时聊天&#xff09;功能&#xff0c;一开始想到的是使用 WebSocket 来实现这个功能&#xff0c;然天意捉弄&#xff08;哈哈&#xff09;服务器版本太低不支持 wx 协议&#xff08;也就不支持 WebSocket了&#xff09;不得不寻找…

深入理解 JVM Class文件格式(八)

在本专栏的第一篇文章 深入理解Java虚拟机到底是什么 中&#xff0c; 我们主要讲解了什么是虚拟机&#xff0c; 这篇博客是对JVM的一个概述。 在随后的几篇文章中&#xff0c;一直在讲解class文件格式。 在今天这篇博客中&#xff0c; 将会继续讲解class文件中的其他信息。 在本…

Function!(计蒜客 - 42386)

Function! fa(x)ax(a>0,a≠1)f_a(x) a ^ x(a > 0, \ a \neq 1)fa​(x)ax(a>0, a​1)&#xff0c;我们要求∑a2n(a∑ban⌊fa−1(b)⌋⌈fb−1(a)⌉)\sum\limits_{a 2} ^{n} \left(a \sum\limits_{b a} ^{n} \lfloor f_a ^{-1}(b) \rfloor \lceil f_b ^{-1}(a) \rce…