原问题:
解题思路:两次质分解即可
代码:
void solve() {
ll i, j,k,x,y,z,p,q,u,v;
ll N = 20000000,NN=15000000;
M.NT.get_prime_Euler(30000000);
ans1 = 0;
p = N - NN;
ll l = M.NT.pcnt;
for (i = N; i > NN; i--) {
u = i;
for (j = 1; M.NT.prime[j] <= u; j++) {
if(M.NT.prime_vis[u]==0){
D[u]++; break;
}
while (u % M.NT.prime[j] == 0) {
D[M.NT.prime[j]]++;
u = u / M.NT.prime[j];
}
if (u == 1)break;
}
if(i%100000==0)
printf("%lld\n", i);
}
for (i = p; i >= 2; i--) {
u = i;
for (j = 1; M.NT.prime[j] <= u; j++) {
if (M.NT.prime_vis[u] == 0) {
D[u]--; break;
}
while (u % M.NT.prime[j] == 0) {
D[M.NT.prime[j]]--;
u = u / M.NT.prime[j];
}
}
if (i % 100000 == 0)
printf("%lld\n", i);
}
for (i = 1; i <= N; i++) {
if (D[i] != 0) {
ans1 = ans1 + i * D[i];
}
}
printf("%lld\n",ans1);
}