結果
問題 | No.2798 Multiple Chain |
ユーザー | shobonvip |
提出日時 | 2024-06-25 02:25:41 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 4,872 bytes |
コンパイル時間 | 3,175 ms |
コンパイル使用メモリ | 230,440 KB |
実行使用メモリ | 133,108 KB |
最終ジャッジ日時 | 2024-06-25 02:25:49 |
合計ジャッジ時間 | 7,588 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
13,760 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 425 ms
17,252 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 90 ms
6,940 KB |
testcase_06 | AC | 202 ms
13,312 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,944 KB |
testcase_09 | AC | 2 ms
6,944 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 2 ms
6,940 KB |
testcase_12 | AC | 2 ms
6,944 KB |
testcase_13 | AC | 3 ms
6,940 KB |
testcase_14 | AC | 7 ms
6,940 KB |
testcase_15 | TLE | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
testcase_27 | -- | - |
testcase_28 | -- | - |
testcase_29 | -- | - |
testcase_30 | -- | - |
testcase_31 | -- | - |
testcase_32 | -- | - |
testcase_33 | -- | - |
testcase_34 | -- | - |
testcase_35 | -- | - |
testcase_36 | -- | - |
testcase_37 | -- | - |
testcase_38 | -- | - |
testcase_39 | -- | - |
testcase_40 | -- | - |
testcase_41 | -- | - |
testcase_42 | -- | - |
testcase_43 | -- | - |
testcase_44 | -- | - |
testcase_45 | -- | - |
testcase_46 | -- | - |
testcase_47 | -- | - |
testcase_48 | -- | - |
testcase_49 | -- | - |
testcase_50 | -- | - |
testcase_51 | -- | - |
testcase_52 | -- | - |
testcase_53 | -- | - |
ソースコード
#include<bits/stdc++.h> using namespace std; typedef long long ll; // Fast Factorization // https://judge.yosupo.jp/submission/38126 // !!! CHANGED THE PRIMARY TEST !!! typedef unsigned int uint; struct Mint { uint64_t n; static uint64_t mod, inv, r2; Mint() : n(0) { } Mint(const uint64_t &x) : n(init(x)) { } static uint64_t init(const uint64_t &w) { return reduce(__uint128_t(w) * r2); } static void set_mod(const uint64_t &m) { mod = inv = m; for(int i = 0; i < 5; i++) inv *= 2 - inv * m; r2 = -__uint128_t(m) % m; } static uint64_t reduce(const __uint128_t &x) { uint64_t y = uint64_t(x >> 64) - uint64_t((__uint128_t(uint64_t(x) * inv) * mod) >> 64); return int64_t(y) < 0 ? y + mod : y; } Mint& operator+= (const Mint &x) { n += x.n - mod; if(int64_t(n) < 0) n += mod; return *this; } Mint& operator+ (const Mint &x) const { return Mint(*this) += x; } Mint& operator*= (const Mint &x) { n = reduce(__uint128_t(n) * x.n); return *this; } Mint& operator* (const Mint &x) const { return Mint(*this) *= x; } uint64_t val() const { return reduce(n); } }; uint64_t Mint::mod, Mint::inv, Mint::r2; bool suspect(const uint64_t &a, const uint64_t &s, uint64_t d, const uint64_t &n) { if(Mint::mod != n) Mint::set_mod(n); Mint x(1), xx(a), o(x), m(n - 1); while(d > 0) { if(d & 1) x *= xx; xx *= xx; d >>= 1; } if(x.n == o.n) return true; for(uint r = 0; r < s; r++) { if(x.n == m.n) return true; x *= x; } return false; } bool is_prime(const uint64_t &n) { if(n <= 1 || (n > 2 && (~n & 1))) return false; uint64_t d = n - 1, s = 0; while(~d & 1) s++, d >>= 1; static const uint64_t a_big[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022}; static const uint64_t a_smo[] = {2, 7, 61}; if(n < 4759123141LL) { for(auto &&p : a_smo) { if(p >= n) break; if(!suspect(p, s, d, n)) return false; } } else { for(auto &&p : a_big) { if(p >= n) break; if(!suspect(p, s, d, n)) return false; } } return true; } uint64_t rho_pollard(const uint64_t &n) { if(~n & 1) return 2u; static random_device rng; uniform_int_distribution<uint64_t> rr(1, n - 1); if(Mint::mod != n) Mint::set_mod(n); for(;;) { uint64_t c_ = rr(rng), g = 1, r = 1, m = 500; Mint y(rr(rng)), xx(0), c(c_), ys(0), q(1); while(g == 1) { xx.n = y.n; for(uint i = 1; i <= r; i++) y *= y, y += c; uint64_t k = 0; g = 1; while(k < r && g == 1) { for(uint i = 1; i <= (m > (r - k) ? (r - k) : m); i++) { ys.n = y.n; y *= y; y += c; uint64_t xxx = xx.val(), yyy = y.val(); q *= Mint(xxx > yyy ? xxx - yyy : yyy - xxx); } g = __gcd<uint64_t>(q.val(), n); k += m; } r *= 2; } if(g == n) g = 1; while(g == 1) { ys *= ys; ys += c; uint64_t xxx = xx.val(), yyy = ys.val(); g = __gcd<uint64_t>(xxx > yyy ? xxx - yyy : yyy - xxx, n); } if(g != n && is_prime(g)) return g; } assert(69 == 420); } template <typename T> vector<T> inter_factor(const T &n) { if(n < 2) return { }; if(is_prime(n)) return {n}; T d = rho_pollard(static_cast<uint64_t>(n)); vector<T> l = inter_factor(d), r = inter_factor(n / d); l.insert(l.end(), r.begin(), r.end()); return l; } template <typename T> vector<T> factor(T n) { vector<T> f1; for(uint i = 2; i < 100; i += (i & 1) + 1) while(n % i == 0) f1.push_back(i), n /= i; vector<T> f2 = inter_factor(n); f1.insert(f1.end(), f2.begin(), f2.end()); sort(f1.begin(), f1.end()); return f1; } template <typename T> vector<T> makediv(T n) { vector<T> pf = factor(n); vector<pair<T,int>> cmp; if (pf.empty()){ return {n}; } T memo = pf[0]; int tmp = 0; for (int i=0; i<(int)pf.size(); i++){ if (memo == pf[i]){ tmp++; }else{ cmp.push_back(pair(memo, tmp)); memo = pf[i]; tmp = 1; } } cmp.push_back(pair(memo, tmp)); vector<T> ret; auto calc = [&](auto self, T i, int s, int r, bool use) -> void { if (use){ ret.push_back(i); } if (s >= (int)cmp.size()) return; if (r + 1 <= cmp[s].second){ self(self, i * cmp[s].first, s, r + 1, 1); } self(self, i, s + 1, 0, 0); return; }; calc(calc, 1, 0, 0, 1); sort(ret.begin(), ret.end()); return ret; } int main(){ ll n; cin >> n; vector<ll> d = makediv(n); map<pair<ll,int>, ll> memo; int m = d.size(); vector<vector<int>> edge_list(m, vector<int>(0)); for (int i=0; i<m; i++){ for (int j=i; j<m; j++){ if (d[j] % d[i] == 0) { edge_list[i].push_back(j); } } } auto calc = [&](auto self, ll i, int j) -> ll { if (n % i != 0) return 0; if (i == n) return 1LL; if (memo.find(pair(i, j)) != memo.end()){ return memo[pair(i, j)]; } ll ret = 0; for (int x: edge_list[j]){ if (i * d[x] > n) break; ret += self(self, i * d[x], x); } memo[pair(i, j)] = ret; return ret; }; ll ans = 0; for (int x=1; x<(int)d.size(); x++){ ans += calc(calc, d[x], x); } cout << ans << '\n'; }