complete 1929.cpp 17425.cpp 32870.cpp 11868.rs

This commit is contained in:
2026-03-21 20:40:37 +09:00
parent 7768f8b446
commit a42056c8d1
4 changed files with 237 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
#include <cmath>
#include <iostream>
#include <vector>
#define let auto
#define fn auto
#define usize size_t
using namespace std;
fn fastio() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
}
const let N_MAX = 1'000'000;
let Primes = vector<usize>();
fn generate_primes(usize n) {
Primes.clear();
Primes.push_back(2);
for (usize i = 3; i <= n; i += 2) {
for (let p: Primes) {
if (i % p == 0) {
break;
} else if (p * p > i) {
Primes.push_back(i);
break;
}
}
}
}
fn prime_factors(usize n) -> vector<pair<usize, usize>> {
let factors = vector<pair<usize, usize>>();
for (let p: Primes) {
if (n == 1) {
break;
}
if (p * p > n) {
factors.push_back(pair(n, 1));
break;
}
let cnt = 0;
while (n % p == 0) {
n /= p;
cnt += 1;
}
if (cnt > 0) {
factors.push_back(pair(p, cnt));
}
}
return factors;
}
fn divisor_sum(usize n) -> usize {
static usize div_sum[N_MAX + 1];
if (div_sum[n] != 0) {
return div_sum[n];
}
let s = 1;
let fs = prime_factors(n);
for (let f: fs) {
s *= ((usize) pow(f.first, f.second + 1) - 1) / (f.first - 1);
}
div_sum[n] = s;
return s;
}
fn cumulative_divisor_sum(usize n) -> usize {
static usize cum_div_sum[N_MAX + 1];
if (cum_div_sum[n] != 0) {
return cum_div_sum[n];
}
for (usize i = 1; i <= N_MAX; i++) {
cum_div_sum[i] = divisor_sum(i) + cum_div_sum[i - 1];
}
return cum_div_sum[n];
}
fn main() -> int {
fastio();
generate_primes(N_MAX);
usize t;
cin >> t;
for (usize i = 0; i < t; i++) {
usize n;
cin >> n;
cout << cumulative_divisor_sum(n) << "\n";
}
}