【Cf #502 F】The Neutral Zone

本题把$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\n", ans);
  
  return 0;
}
View Code

 

posted @ 2018-08-09 21:54  Dance_Of_Faith  阅读(177)  评论(0编辑  收藏  举报