/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 590ms 8.02 MiB
#2 Accepted 607ms 8.441 MiB
#3 Accepted 607ms 8.441 MiB
#4 Accepted 599ms 8.441 MiB
#5 Accepted 602ms 8.449 MiB
#6 Accepted 632ms 8.434 MiB

Code

using i64 = long long;
using i128 = __int128;
using u32 = unsigned;
using u64 = unsigned long long;
using f32 = double;
using f64 = long double;

#define uset unordered_set
#define umap unordered_map
#define vi vector<int>
#define vvi vector<vi>
#define vll vector<i64>
#define vvll vector<vll>
#define pii pair<int, int>
#define pll pair<i64, i64>
#define vpii vector<pii>
#define vpll vector<pll>
#define vvpii vector<vpii>
#define vvpll vector<vpll>
#define vz vector<Z>
#define vvz vector<vz>
#define pb push_back
#define pq priority_queue
#define ALL(x) (x).begin(), (x).end()
#define rep(i, x, y) for (int (i) = (x); (i) < (y); (i)++)
#define repr(i, x, y) for (int (i) = (x); (i) > (y); (i)--)
#define YES "YES\n"
#define NO "NO\n"
#define SZ(x) (static_cast<int>(x.size()))


#include <bits/stdc++.h>

using namespace std;

mt19937_64 rng((unsigned) chrono::high_resolution_clock::now().time_since_epoch().count());

const int MAX = 1000010;

vi f(MAX), g(MAX);

void init() {
    iota(ALL(f), 0);
    rep(i, 2, MAX) if (f[i] == i) for (int j = i + i; j < MAX; j += i) f[j] = min(f[j], i);
    auto get = [&](int n) {
        umap<int, int> cnt;
        while (n > 1) {
            cnt[f[n]]++;
            n /= f[n];
        }
        return cnt;
    };
    int prev = 0;
    rep(i, 1, MAX) {
        g[i] = g[i - 1];
        if (i & 1) {
            auto f1 = get((i + 1) / 2);
            auto f2 = get(i);
            for (auto &[p, c] : f2) f1[p] += c;
            int ans = 1;
            for (auto &[p, c] : f1) ans *= c + 1;
            if (ans > prev) {
                prev = ans;
                g[i] = ans;
            }
        } else {
            auto f1 = get(i / 2);
            auto f2 = get(i + 1);
            for (auto &[p, c] : f2) f1[p] += c;
            int ans = 1;
            for (auto &[p, c] : f1) ans *= c + 1;
            if (ans > prev) {
                prev = ans;
                g[i] = ans;
            }
        }
    }
}

void solve() {
    int n;
    cin >> n;
    cout << g[n] << "\n";
}

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

    init();
    int t;
    cin >> t;
    while (t--) solve();
}

Information

Submit By
Type
Submission
Problem
P1180 Maximum Divisor
Contest
Brain Booster #9
Language
C++17 (G++ 13.2.0)
Submit At
2025-04-06 15:50:57
Judged At
2025-04-06 15:50:57
Judged By
Score
100
Total Time
632ms
Peak Memory
8.449 MiB