链接:https://ac.nowcoder.com/acm/problem/53079
来源:牛客网
题目描述
Forsaken有一个有趣的数论函数。对于任意一个数xxx,f(x)f(x)f(x)会返回xxx的最小质因子。如果这个数没有最小质因子,那么就返回0。
现在给定任意一个nnn,Forsaken想知道∑i=1nf(i)\sum_{i = 1}^{n}{f(i)}∑i=1nf(i)的值。
输入描述:
一个整数nnn。
输出描述:
一个整数代表上面的求和式的值。
示例1
输入
复制
4
输出
复制
7
备注:
1≤n≤3e71 \leq n \leq 3e71≤n≤3e7
线性筛塞一下就好了
#define int long long
int n, m, Q, K;
int prime[MAXN], pn = 0, tmin[MAXN], N;
ll ans = 0;
bool vis[MAXN];
void get_prime() {
vis[0] = vis[1] = true;
for(int i=2; i<n; i++) {
if(!vis[i]) {
prime[pn++] = i;
tmin[i] = i;
}
for(int j=0; j<pn && prime[j]*i<n; j++) {
int p = prime[j]*i;
vis[p] = true;
tmin[p] = prime[j];
// if(!tmin[p] && !vis[i]) tmin[p] = i;
if(i%prime[j] == 0) break;
}
ans += tmin[i];
// show(tmin[i]);
}
}
signed main() {
#ifdef debug
freopen("test.txt", "r", stdin);
clock_t stime = clock();
#endif
read(n);
n ++;
get_prime();
printf("%lld\n", ans);
// forarr(prime, 0, 10);
#ifdef debug
clock_t etime = clock();
printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif
return 0;
}