本题把$log$化简之后求得就是每个质数$f$前的系数,求系数并不难,难点在于求出所有的质数。
由于空间限制相当苛刻,$3e8$的$bitset$的内存超限,我们考虑所有的除了$2$和$3$以外的质数,他们可以被表示成$p equiv pm 1 (mod ; 6) $。(具体来讲就是把数表示成$6k, 6k+1, 6k+2, 6k+3, 6k+4, 6k+5$,显然只有余数为$1$或$5$才有成为质数的可能性)。然后我们需要筛的个数就变成原来的三分之一了。
另一个做法:分块,一部分一部分筛,空间限制就不紧张了。
#include <cstdio> #include <bitset> typedef unsigned UI; UI ans, n, A, B, C, D; std::bitset<100000001> ntp; inline void Add(UI x) { UI fc = A * x * x * x + B * x * x + C * x + D; for (UI t = n; t; t /= x) { ans += t / x * fc; } } int main() { scanf("%u%u%u%u%u", &n, &A, &B, &C, &D); Add(2); Add(3); for (UI i = 5, d = 2; i <= n; i += d, d = 6 - d) { if (!ntp[i / 3]) { Add(i); if (i > n / i) continue; for (UI j = i * i, v = d; j <= n; j += i * v, v = 6 - v) { ntp[j / 3] = 1; } } } printf("%u ", ans); return 0; }