提出 #67786472
ソースコード 拡げる
#include <bits/stdc++.h> #include <cstdint> #include <istream> #include <ostream> using std::istream, std::ostream; template <uint32_t base> struct Montgomery { using i32 = int32_t; using u32 = uint32_t; using u64 = uint64_t; static constexpr u32 mod() { return base; } static constexpr u32 np = []() { u32 x = base; for (int i = 0; i < 4; ++i) { x *= 2u - base * x; } return -x; }(); static constexpr u32 r2 = -(u64)(base) % base; static_assert(base < (1u << 30)); static_assert(base * np + 1 == 0); static u32 reduce(u64 x) { return (x + (u64)((u32)x * np) * base) >> 32; } u32 x; Montgomery(): x(0) {} constexpr Montgomery(long long y): x(y ? reduce((u64)(y % base + base) * r2) : 0) {} Montgomery& operator +=(const Montgomery& ot) { if ((i32)(x += ot.x - 2 * base) < 0) { x += 2 * base; } return *this; } Montgomery& operator -=(const Montgomery& ot) { if ((i32)(x -= ot.x) < 0) { x += 2 * base; } return *this; } Montgomery& operator *=(const Montgomery& ot) { x = reduce((u64)x * ot.x); return *this; } Montgomery& operator /=(const Montgomery& ot) { return *this *= ot.inverse(); } friend Montgomery operator +(Montgomery a, const Montgomery& b) { a += b; return a; } friend Montgomery operator -(Montgomery a, const Montgomery& b) { a -= b; return a; } friend Montgomery operator *(Montgomery a, const Montgomery& b) { a *= b; return a; } friend Montgomery operator /(Montgomery a, const Montgomery& b) { a /= b; return a; } Montgomery operator -() const { return Montgomery() - *this; } u32 get() const { u32 res = reduce(x); return res < base ? res : res - base; } u32 operator ()() const { return get(); } Montgomery inverse() const { return pow(base - 2); } Montgomery inv() const { return inverse(); } Montgomery pow(int64_t p) const { if (p < 0) { return pow(-p).inverse(); } Montgomery res = 1; Montgomery a = *this; while (p) { if (p & 1) { res *= a; } p >>= 1; a *= a; } return res; } friend istream& operator >>(istream& istr, Montgomery& m) { long long x; istr >> x; m = Montgomery(x); return istr; } friend ostream& operator <<(ostream& ostr, const Montgomery& m) { return ostr << m.get(); } bool operator ==(const Montgomery& ot) const { return (x >= base ? x - base : x) == (ot.x >= base ? ot.x - base : ot.x); } bool operator !=(const Montgomery& ot) const { return (x >= base ? x - base : x) != (ot.x >= base ? ot.x - base : ot.x); } explicit operator int64_t() const { return x; } explicit operator bool() const { return x; } }; #include <vector> #include <utility> using std::vector, std::pair; pair<vector<int>, vector<int>> sieve(int n) { vector<int> erat(n + 1); vector<int> primes; erat[1] = 1; for (int i = 2; i <= n; ++i) { if (erat[i] == 0) { erat[i] = i; primes.push_back(i); } for (int p : primes) { if (p > erat[i] || i * p > n) { break; } erat[i * p] = p; } } return {erat, primes}; } vector<int> calc_phi(const vector<int>& erat) { const int n = erat.size(); vector<int> phi(n); phi[1] = 1; for (int i = 2; i < n; ++i) { phi[i] = phi[i / erat[i]] * erat[i]; if (erat[i] != erat[i / erat[i]]) { phi[i] -= phi[i / erat[i]]; } } return phi; } vector<int> calc_mu(const vector<int>& erat) { const int n = erat.size(); vector<int> mu(n); mu[1] = 1; for (int i = 2; i < n; ++i) { mu[i] = (erat[i] == erat[i / erat[i]]) ? 0 : -mu[i / erat[i]]; } return mu; } #define all(x) (x).begin(), (x).end() using namespace std; inline int nxt() { int x; cin >> x; return x; } constexpr int mod = 998244353; using Mint = Montgomery<mod>; const int N = 202'222; void solve() { vector<Mint> r(N); vector<Mint> ir(N); for (int i = 1; i < N; ++i) { r[i] = r[i - 1] * 10 + 1; ir[i] = r[i].inv(); } const auto erat = sieve(N).first; const auto mu = calc_mu(erat); vector<Mint> rr(N, 1); for (int g = 1; g < N; ++g) { for (int dg = 1; dg * g < N; ++dg) { if (mu[dg] == 1) { rr[g * dg] *= r[g]; } else if (mu[dg] == -1) { rr[g * dg] *= ir[g]; } } } vector<vector<int>> divs(N); for (int i = 1; i < N; ++i) { for (int j = 1; i * j < N; ++j) { divs[i * j].push_back(i); } } vector<char> present(N); int n = nxt(); Mint ans = 1; for (int i = 0; i < n; ++i) { int x = nxt(); if (!present[x]) { for (int d : divs[x]) { if (!present[d]) { present[d] = true; ans *= rr[d]; } } } cout << ans << "\n"; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int t = 1; // nxt(); while (t--) { solve(); } return 0; }
提出情報
提出日時 | |
---|---|
問題 | C - Repunits |
ユーザ | Golovanov399 |
言語 | C++ 20 (gcc 12.2) |
得点 | 900 |
コード長 | 4963 Byte |
結果 | AC |
実行時間 | 159 ms |
メモリ | 28964 KiB |
ジャッジ結果
セット名 | Sample | All | ||||
---|---|---|---|---|---|---|
得点 / 配点 | 0 / 0 | 900 / 900 | ||||
結果 |
|
|
セット名 | テストケース |
---|---|
Sample | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt |
All | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_n_small_00.txt, 01_n_small_01.txt, 01_n_small_02.txt, 01_n_small_03.txt, 01_n_small_04.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 02_random_10.txt, 02_random_11.txt, 02_random_12.txt, 02_random_13.txt, 02_random_14.txt, 03_hcn_00.txt, 03_hcn_01.txt, 03_hcn_02.txt, 03_hcn_03.txt, 03_hcn_04.txt, 04_max_00.txt, 05_min_00.txt |
ケース名 | 結果 | 実行時間 | メモリ |
---|---|---|---|
00_sample_00.txt | AC | 111 ms | 28924 KiB |
00_sample_01.txt | AC | 107 ms | 28788 KiB |
00_sample_02.txt | AC | 107 ms | 28800 KiB |
01_n_small_00.txt | AC | 106 ms | 28780 KiB |
01_n_small_01.txt | AC | 112 ms | 28856 KiB |
01_n_small_02.txt | AC | 109 ms | 28784 KiB |
01_n_small_03.txt | AC | 109 ms | 28964 KiB |
01_n_small_04.txt | AC | 112 ms | 28784 KiB |
02_random_00.txt | AC | 143 ms | 28964 KiB |
02_random_01.txt | AC | 152 ms | 28888 KiB |
02_random_02.txt | AC | 141 ms | 28964 KiB |
02_random_03.txt | AC | 155 ms | 28952 KiB |
02_random_04.txt | AC | 150 ms | 28956 KiB |
02_random_05.txt | AC | 153 ms | 28952 KiB |
02_random_06.txt | AC | 143 ms | 28876 KiB |
02_random_07.txt | AC | 150 ms | 28816 KiB |
02_random_08.txt | AC | 144 ms | 28796 KiB |
02_random_09.txt | AC | 152 ms | 28924 KiB |
02_random_10.txt | AC | 140 ms | 28848 KiB |
02_random_11.txt | AC | 157 ms | 28888 KiB |
02_random_12.txt | AC | 159 ms | 28904 KiB |
02_random_13.txt | AC | 158 ms | 28892 KiB |
02_random_14.txt | AC | 158 ms | 28820 KiB |
03_hcn_00.txt | AC | 136 ms | 28880 KiB |
03_hcn_01.txt | AC | 135 ms | 28796 KiB |
03_hcn_02.txt | AC | 139 ms | 28844 KiB |
03_hcn_03.txt | AC | 135 ms | 28744 KiB |
03_hcn_04.txt | AC | 136 ms | 28884 KiB |
04_max_00.txt | AC | 132 ms | 28900 KiB |
05_min_00.txt | AC | 111 ms | 28888 KiB |