求 前 項的和對 取模的值。
。
考慮 min_25 篩中的 ( 次方,即滿足條件的數的個數)和 。
特別地,有 。
所以 。
也就是最小質因子爲 的數的個數。(不包括 )
那麼答案爲 。
……嗎?
由於 min_25 篩只能處理到 的質數,所以 的質數不會被統計到。
所以分質數和合數兩類討論。合數部分上面討論完了。質數部分是模板。
答案爲 。
時間複雜度 。
以上題解轉自https://www.cnblogs.com/1000Suns/p/10888832.html
以下是本人代碼:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1000005;
const int mod = 20190601, inv2 = 10095301;
LL n, a[MAXN];
int m, sqr, s[2][MAXN];
inline int cal(LL N) { N%=mod; return 1ll*N*(N+1)%mod*inv2%mod; }
inline int ID(LL x) { return x <= sqr ? x : m-n/x+1; }
int main () {
cin>>n; sqr = sqrt(n);
for(LL i = 1; i <= n; ++i)
a[++m] = i = n/(n/i),
s[0][m] = i%mod-1,
s[1][m] = cal(i)-1;
int ans = 0;
for(int i = 2; i <= sqr; ++i) if(s[0][i]^s[0][i-1]) {
ans = (ans + 1ll*(s[0][ID(n/i)]-s[0][i-1])*i) % mod;
for(int j = m; a[j] >= 1ll*i*i; --j) {
s[0][j] = (s[0][j] - 1ll*(s[0][ID(a[j]/i)]-s[0][i-1])) % mod;
s[1][j] = (s[1][j] - 1ll*i*(s[1][ID(a[j]/i)]-s[1][i-1])) % mod;
}
}
ans = (ans + s[1][m]) % mod;
ans = (ans - n%mod + 1) % mod;
ans = (ans - s[0][m]) % mod;
printf("%d\n", (ans + mod) % mod);
}