結果
| 問題 |
No.888 約数の総和
|
| コンテスト | |
| ユーザー |
SnowBeenDiding
|
| 提出日時 | 2025-03-16 02:48:57 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 3,748 bytes |
| コンパイル時間 | 5,967 ms |
| コンパイル使用メモリ | 334,276 KB |
| 実行使用メモリ | 7,324 KB |
| 最終ジャッジ日時 | 2025-03-16 02:49:05 |
| 合計ジャッジ時間 | 7,473 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
#include <atcoder/all>
#include <bits/stdc++.h>
#define rep(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++)
using namespace atcoder;
using namespace std;
typedef long long ll;
vector<ll> getDivisors(ll n) {
auto mod_mul = [](ll a, ll b, ll mod) -> ll {
return (__int128)a * b % mod;
};
auto mod_pow = [&](ll base, ll exp, ll mod) -> ll {
ll result = 1;
base %= mod;
while (exp) {
if (exp & 1)
result = mod_mul(result, base, mod);
base = mod_mul(base, base, mod);
exp >>= 1;
}
return result;
};
auto is_prime = [&](ll num) -> bool {
if (num < 2)
return false;
int smallPrimes[12] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
for (int p : smallPrimes) {
if (num == p)
return true;
if (num % p == 0)
return false;
}
ll d = num - 1;
int s = 0;
while ((d & 1) == 0) {
d /= 2;
s++;
}
ll testPrimes[7] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022};
for (ll a : testPrimes) {
if (a % num == 0)
continue;
ll x = mod_pow(a, d, num);
if (x == 1 || x == num - 1)
continue;
bool composite = true;
for (int i = 0; i < s - 1; i++) {
x = mod_mul(x, x, num);
if (x == num - 1) {
composite = false;
break;
}
}
if (composite)
return false;
}
return true;
};
function<ll(ll)> pollard_rho;
pollard_rho = [&](ll num) -> ll {
if (num % 2 == 0)
return 2;
mt19937_64 rng(random_device{}());
uniform_int_distribution<ll> dist(2, num - 2);
ll x = dist(rng), y = x, c = dist(rng), d = 1;
auto f = [&](ll x, ll c, ll mod) -> ll {
return (mod_mul(x, x, mod) + c) % mod;
};
while (d == 1) {
x = f(x, c, num);
y = f(y, c, num);
y = f(y, c, num);
d = gcd(abs(x - y), num);
if (d == num)
return pollard_rho(num);
}
return d;
};
function<void(ll, vector<ll> &)> factorize;
factorize = [&](ll num, vector<ll> &factors) {
if (num == 1)
return;
if (is_prime(num)) {
factors.push_back(num);
return;
}
ll factor = pollard_rho(num);
factorize(factor, factors);
factorize(num / factor, factors);
};
vector<ll> factors;
factorize(n, factors);
sort(factors.begin(), factors.end());
vector<pair<ll, int>> factorCounts;
for (ll f : factors) {
if (factorCounts.empty() || factorCounts.back().first != f)
factorCounts.push_back({f, 1});
else
factorCounts.back().second++;
}
vector<ll> divisors;
function<void(int, ll)> dfs = [&](int idx, ll current) {
if (idx == factorCounts.size()) {
divisors.push_back(current);
return;
}
ll prime = factorCounts[idx].first;
int exp = factorCounts[idx].second;
for (int i = 0; i <= exp; i++) {
dfs(idx + 1, current);
current *= prime;
}
};
dfs(0, 1);
sort(divisors.begin(), divisors.end());
return divisors;
}
int main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
ll n;
cin >> n;
vector<ll> divisors = getDivisors(n);
ll ans = 0;
for (ll d : divisors) {
ans += d;
}
cout << ans << endl;
}
SnowBeenDiding