日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZOJ The Sum of Unitary Totient(min_25 筛)

發布時間:2023/12/4 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZOJ The Sum of Unitary Totient(min_25 筛) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

The Sum of Unitary Totient

積性函數,滿足質數點是多項式,直接 min_25 了,由于單次求解,所以使用遞歸的 min_25 會較快。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int prime[N], a[N], id1[N], id2[N], cnt, n, T, m;long long sum1[N], sum2[N], g1[N], g2[N], s[N];bool st[N];inline int ID(int x) {return x <= T ? id1[x] : id2[n / x]; }void init() {T = sqrt(n + 0.5);m = 0;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;g1[m] = 1ll * a[m] * (a[m] + 1) / 2 - 1;g2[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++) {g1[i] -= 1ll * prime[j] * (g1[ID(a[i] / prime[j])] - sum1[j - 1]);g2[i] -= (g2[ID(a[i] / prime[j])] - sum2[j - 1]);}}/*下面是遞推的 min_25。*/// for (int i = 1; i <= m; i++) {// s[i] = g1[i] - g2[i];// }// int top = 1;// while (1ll * prime[top] * prime[top] <= n) {// top++;// }// top--;// for (int j = top; 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] += 1ll * (cur - 1) * (s[ID(a[i] / cur)] - sum1[j] + sum2[j]) + cur * prime[j] - 1;// }// }// } }long long solve(int n, int m) {if (n < prime[m]) {return 0;} long long res = g1[ID(n)] - g2[ID(n)] - sum1[m - 1] + sum2[m - 1];for(int j = m; j <= cnt && 1ll * prime[j] * prime[j] <= n; j++) {for(int i = prime[j]; 1ll * i * prime[j] <= n; i *= prime[j]) {res += (i - 1) * solve(n / i, j + 1) + i * prime[j] - 1;}} return res; }int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);for (int i = 2; i < N; i++) {if (!st[i]) {prime[++cnt] = i;sum1[cnt] = sum1[cnt - 1] + i;sum2[cnt] = sum2[cnt - 1] + 1;}for (int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) {st[i * prime[j]] = 1;if (i % prime[j] == 0) {break;}}}while (scanf("%d", &n) != EOF) {init();printf("%lld\n", solve(n, 1) + 1);}return 0; }

總結

以上是生活随笔為你收集整理的ZOJ The Sum of Unitary Totient(min_25 筛)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。