【求助】关于杜教筛的一个问题

P1587 [NOI2016] 循环之美

看不出来为啥
by 小粉兔 @ 2019-02-28 18:58:25


map本身就有$O(\log N)$的复杂度吧
by Orina_zju @ 2019-02-28 18:59:07


你需要确定数组大小的确是 N / MAXN 的,并且没有改动其他地方
by 小粉兔 @ 2019-02-28 18:59:32


@[小粉兔](/space/show?uid=10703) 数组大小是`1e7`,应该够的。 我现在觉得可能是其他地方数组溢出了。 这是完整的代码。(如果需要的话) ```cpp // BZOJ 4652 // NOI 2016 #include <cstdio> #include <cmath> #include <algorithm> #include <map> #include <cassert> const int MAXK = 2005, MAXN = 1e7; typedef int IntAr[MAXN + 10]; typedef long long LL; typedef std::pair<int, int> Pii; int N, M, K, totp, totf, fack[MAXK], F[MAXK]; IntAr mu, sum1, /*sum2, */flag, P/*, vis*/; std::map<Pii, int> mp; std::map<int, int> mpm; int g(int n, int k); inline LL f(int n) { return (LL)n / K * F[K] + F[n % K]; } int main() { scanf("%d%d%d", &N, &M, &K); mu[1] = sum1[1] = 1; for (int i = 2; i <= MAXN; i++) { if (!flag[i]) P[totp++] = i, mu[i] = -1; for (int j = 0, pd; j < totp && (pd = i * P[j]) <= MAXN; j++) { flag[pd] = 1; if (i % P[j] == 0) { mu[pd] = 0; break; } mu[pd] = -mu[i]; } sum1[i] = sum1[i - 1] + mu[i]; } for (int i = 1; i <= K; i++) { if (K % i == 0) fack[totf++] = i; F[i] = F[i - 1] + (std::__gcd(i, K) == 1); } LL ans = 0, lst = 0, cur; for (int i = 1, j; i <= N && i <= M; i = j + 1, lst = cur) { j = std::min(N / (N / i), M / (M / i)); cur = g(j, K); ans += LL(cur - lst) * (N / i) * f(M / i); } printf("%lld\n", ans); return 0; } int S(int n) { if (n <= MAXN) return sum1[n]; // if (vis[N / n]) return sum2[N / n]; // vis[N / n] = 1; // int & ret = sum2[N / n]; if (mpm.count(n)) return mpm[n]; int & ret = mpm[n]; ret = n > 1; for (int i = 2, j; i <= n; i = j + 1) { j = n / (n / i); ret -= (j - i + 1) * S(n / i); } return ret; } int g(int n, int k) { if (!n) return 0; if (k == 1) return S(n); Pii cur(n, k); if (mp.count(cur)) return mp[cur]; int & ret = mp[cur]; ret = 0; for (int i = 0, fac; i < totf && (fac = fack[i]) <= k; i++) { if (k % fac || !mu[fac]) continue; ret += g(n / fac, fac); } return ret; } ```
by CaptainSlow @ 2019-02-28 19:07:22


可能是因为n,m的断点不同,所以N/n会发生冲突吧
by Binary_Search_Tree @ 2019-08-04 16:52:37


@[CaptainSlow](/space/show?uid=28022)
by Binary_Search_Tree @ 2019-08-04 16:52:52


改成N/n+M/n可能就可以了吧
by Binary_Search_Tree @ 2019-08-04 17:11:04


@[CaptainSlow](/space/show?uid=28022)
by Binary_Search_Tree @ 2019-08-04 22:29:04


@[牛的传说](/space/show?uid=40985) 大佬有高见啊!果然过了!谢了谢了!
by CaptainSlow @ 2019-08-05 08:11:03


|