結果
問題 | No.2682 Visible Divisible |
ユーザー | nonon |
提出日時 | 2024-03-20 21:19:41 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 56 ms / 2,000 ms |
コード長 | 6,664 bytes |
コンパイル時間 | 2,001 ms |
コンパイル使用メモリ | 208,820 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-09-30 07:05:29 |
合計ジャッジ時間 | 3,601 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 40 ms
6,816 KB |
testcase_01 | AC | 56 ms
6,820 KB |
testcase_02 | AC | 55 ms
6,820 KB |
testcase_03 | AC | 52 ms
6,816 KB |
testcase_04 | AC | 34 ms
6,820 KB |
testcase_05 | AC | 34 ms
6,816 KB |
testcase_06 | AC | 35 ms
6,820 KB |
testcase_07 | AC | 33 ms
6,816 KB |
testcase_08 | AC | 2 ms
6,816 KB |
testcase_09 | AC | 1 ms
6,820 KB |
testcase_10 | AC | 1 ms
6,816 KB |
testcase_11 | AC | 42 ms
6,816 KB |
testcase_12 | AC | 39 ms
6,816 KB |
testcase_13 | AC | 38 ms
6,816 KB |
testcase_14 | AC | 50 ms
6,816 KB |
testcase_15 | AC | 42 ms
6,816 KB |
testcase_16 | AC | 37 ms
6,816 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; using int64 = long long; const int mod = 1e9 + 7; const int64 infll = (1LL << 62) - 1; const int inf = (1 << 30) - 1; struct IoSetup { IoSetup() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(10); cerr << fixed << setprecision(10); } } iosetup; template< typename T1, typename T2 > ostream &operator<<(ostream &os, const pair< T1, T2 > &p) { os << p.first << " " << p.second; return os; } template< typename T1, typename T2 > istream &operator>>(istream &is, pair< T1, T2 > &p) { is >> p.first >> p.second; return is; } template< typename T > ostream &operator<<(ostream &os, const vector< T > &v) { for(int i = 0; i < (int) v.size(); i++) { os << v[i] << (i + 1 != v.size() ? " " : ""); } return os; } template< typename T > istream &operator>>(istream &is, vector< T > &v) { for(T &in : v) is >> in; return is; } template< typename T1, typename T2 > inline bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); } template< typename T1, typename T2 > inline bool chmin(T1 &a, T2 b) { return a > b && (a = b, true); } template< typename T = int64 > vector< T > make_v(size_t a) { return vector< T >(a); } template< typename T, typename... Ts > auto make_v(size_t a, Ts... ts) { return vector< decltype(make_v< T >(ts...)) >(a, make_v< T >(ts...)); } template< typename T, typename V > typename enable_if< is_class< T >::value == 0 >::type fill_v(T &t, const V &v) { t = v; } template< typename T, typename V > typename enable_if< is_class< T >::value != 0 >::type fill_v(T &t, const V &v) { for(auto &e : t) fill_v(e, v); } template< typename F > struct FixPoint : F { explicit FixPoint(F &&f) : F(forward< F >(f)) {} template< typename... Args > decltype(auto) operator()(Args &&... args) const { return F::operator()(*this, forward< Args >(args)...); } }; template< typename F > inline decltype(auto) MFP(F &&f) { return FixPoint< F >{forward< F >(f)}; } namespace FastPrimeFactorization { template< typename word, typename dword, typename sword > struct UnsafeMod { UnsafeMod() : x(0) {} UnsafeMod(word _x) : x(init(_x)) {} bool operator==(const UnsafeMod &rhs) const { return x == rhs.x; } bool operator!=(const UnsafeMod &rhs) const { return x != rhs.x; } UnsafeMod &operator+=(const UnsafeMod &rhs) { if((x += rhs.x) >= mod) x -= mod; return *this; } UnsafeMod &operator-=(const UnsafeMod &rhs) { if(sword(x -= rhs.x) < 0) x += mod; return *this; } UnsafeMod &operator*=(const UnsafeMod &rhs) { x = reduce(dword(x) * rhs.x); return *this; } UnsafeMod operator+(const UnsafeMod &rhs) const { return UnsafeMod(*this) += rhs; } UnsafeMod operator-(const UnsafeMod &rhs) const { return UnsafeMod(*this) -= rhs; } UnsafeMod operator*(const UnsafeMod &rhs) const { return UnsafeMod(*this) *= rhs; } UnsafeMod pow(uint64_t e) const { UnsafeMod ret(1); for(UnsafeMod base = *this; e; e >>= 1, base *= base) { if(e & 1) ret *= base; } return ret; } word get() const { return reduce(x); } static constexpr int word_bits = sizeof(word) * 8; static word modulus() { return mod; } static word init(word w) { return reduce(dword(w) * r2); } static void set_mod(word m) { mod = m; inv = mul_inv(mod); r2 = -dword(mod) % mod; } static word reduce(dword x) { word y = word(x >> word_bits) - word((dword(word(x) * inv) * mod) >> word_bits); return sword(y) < 0 ? y + mod : y; } static word mul_inv(word n, int e = 6, word x = 1) { return !e ? x : mul_inv(n, e - 1, x * (2 - x * n)); } static word mod, inv, r2; word x; }; using uint128_t = __uint128_t; using Mod64 = UnsafeMod< uint64_t, uint128_t, int64_t >; template<> uint64_t Mod64::mod = 0; template<> uint64_t Mod64::inv = 0; template<> uint64_t Mod64::r2 = 0; using Mod32 = UnsafeMod< uint32_t, uint64_t, int32_t >; template<> uint32_t Mod32::mod = 0; template<> uint32_t Mod32::inv = 0; template<> uint32_t Mod32::r2 = 0; bool miller_rabin_primality_test_uint64(uint64_t n) { Mod64::set_mod(n); uint64_t d = n - 1; while(d % 2 == 0) d /= 2; Mod64 e{1}, rev{n - 1}; for(uint64_t a : {2, 325, 9375, 28178, 450775, 9780504, 1795265022}) { if(n <= a) break; uint64_t t = d; Mod64 y = Mod64(a).pow(t); while(t != n - 1 && y != e && y != rev) { y *= y; t *= 2; } if(y != rev && t % 2 == 0) return false; } return true; } bool miller_rabin_primality_test_uint32(uint32_t n) { Mod32::set_mod(n); uint32_t d = n - 1; while(d % 2 == 0) d /= 2; Mod32 e{1}, rev{n - 1}; for(uint32_t a : {2, 7, 61}) { if(n <= a) break; uint32_t t = d; Mod32 y = Mod32(a).pow(t); while(t != n - 1 && y != e && y != rev) { y *= y; t *= 2; } if(y != rev && t % 2 == 0) return false; } return true; } bool is_prime(uint64_t n) { if(n == 2) return true; if(n == 1 || n % 2 == 0) return false; if(n < uint64_t(1) << 31) return miller_rabin_primality_test_uint32(n); return miller_rabin_primality_test_uint64(n); } uint64_t pollard_rho(int64_t n) { if(is_prime(n)) return n; if(n % 2 == 0) return 2; for(int64_t c = 1;; c++) { int64_t x = 2, y = 2, d; do { x = (__int128_t(x) * x + c) % n; y = (__int128_t(y) * y + c) % n; y = (__int128_t(y) * y + c) % n; d = __gcd((x + n - y) % n, n); } while(d == 1); if(d < n) return d; } assert(0); } vector< uint64_t > prime_factor(uint64_t n) { if(n <= 1) return {}; uint64_t p = pollard_rho(n); if(p == n) return {p}; auto l = prime_factor(p); auto r = prime_factor(n / p); copy(begin(r), end(r), back_inserter(l)); return l; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; long K; cin>>N>>K; auto f=FastPrimeFactorization::prime_factor(K); int M=f.size(); vector<int>e(M,0); for(;N--;) { long A; cin>>A; for(int i=0;i<M;i++) { int c=0; while(A%f[i]==0) { A/=f[i]; c++; } e[i]=max(e[i],c); } } for(int i=0;i<M;i++) { while(e[i]--&&K%f[i]==0)K/=f[i]; } cout<<(K==1?"Yes\n":"No\n"); }