Cod sursa(job #3311593)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 23 septembrie 2025 15:13:07
Problema Sum Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define ll long long
#define ld long double

using namespace std;
using namespace __gnu_pbds;

typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

ifstream fin("sum.in");
ofstream fout("sum.out");

const int NMAX = 2e5;

int n;
int big_prime[NMAX + 1];

void eratostene() {
    for(int i = 2; i <= NMAX; i++) {
        if(!big_prime[i]) {
            for(int j = i; j <= NMAX; j += i) {
                big_prime[j] = i;
            }
        }
    }
}

ll get_prog_sum(int n, int x) {
    if(x > n) {
        return 0;
    }
    // a0 = x, r = x
    // sum_n = (x + ultimul) * nr_termeni / 2

    int last = n / x * x;
    int cnt_terms = (last - x) / x + 1;
    return (ll) (x + last) * cnt_terms / 2;
}

ll solve(int n) {
    int cn = n;
    vector<int> factors;
    while(n > 1) {
        int d = big_prime[n];
        factors.push_back(d);
        while(n % d == 0) {
            n /= d;
        }
    }

    n = cn * 2;
    int sz = factors.size();
    ll answer = get_prog_sum(n, 1);
    for(int mask = 1; mask < (1 << sz); mask++) {
        int prod = 1, cnt = 0;
        for(int i = 0; i < sz; i++) {
            if(mask >> i & 1) {
                cnt++;
                prod *= factors[i];
            }
        }
        answer = answer + (cnt % 2 == 1 ? -1 : 1) * get_prog_sum(n, prod);
    }
    return answer;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    eratostene();
    fin >> n;
    while(n--) {
        int x;
        fin >> x;
        fout << solve(x) << '\n';
    }
    return 0;
}