結果

問題 No.577 Prime Powerful Numbers
ユーザー xuzijian629xuzijian629
提出日時 2018-11-02 00:11:45
言語 C++17
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 667 ms / 2,000 ms
コード長 4,164 bytes
コンパイル時間 2,333 ms
コンパイル使用メモリ 184,584 KB
実行使用メモリ 4,384 KB
最終ジャッジ日時 2023-08-12 17:22:30
合計ジャッジ時間 4,367 ms
ジャッジサーバーID
(参考情報)
judge10 / judge2
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 7 ms
4,384 KB
testcase_01 AC 34 ms
4,380 KB
testcase_02 AC 2 ms
4,384 KB
testcase_03 AC 123 ms
4,384 KB
testcase_04 AC 9 ms
4,384 KB
testcase_05 AC 659 ms
4,384 KB
testcase_06 AC 39 ms
4,384 KB
testcase_07 AC 667 ms
4,384 KB
testcase_08 AC 108 ms
4,384 KB
testcase_09 AC 105 ms
4,380 KB
testcase_10 AC 1 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif

using namespace std;
using i64 = int64_t;
using vi = vector<i64>;
using vvi = vector<vi>;
#define int __int128_t
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

int modpow(int a, int n, int mod) {
    if (n == 0) return 1;
    if (n % 2 == 0) {
        int t = modpow(a, n / 2, mod);
        return t * t % mod;
    }
    return a * modpow(a, n - 1, mod) % mod;
}

bool is_prime(int n, int k = 10) {
    if (n == 2) return true;
    if (n < 2 || n % 2 == 0) return false;
    int d = n - 1;
    while (d % 2 == 0) {
        d /= 2;
    }
    for (int i = 0; i < k; i++) {
        int a = rnd() % (n - 2) + 1;
        int t = d;
        int y = modpow(a, t, n);
        while (t != n - 1 && y != 1 && y != n - 1) {
            y = modpow(y, 2, n);
            t *= 2;
        }
        if (y != n - 1 && t % 2 == 0) {
            return false;
        }
    }
    return true;
}

bool powle(int n, int k, int m) {
    __int128_t ret = 1;
    for (int i = 0; i < k; i++) {
        ret *= n;
        if (ret > m) {
            return false;
        }
    }
    return ret <= m;
}

int ksqrt(int n, int k) {
    int l = 1, r = n + 1;
    while (l < r - 1) {
        int m = (l + r) / 2;
        if (powle(m, k, n)) {
            l = m;
        } else {
            r = m;
        }
    }
    return l;
}

__int128_t powi(int n, int k) {
    __int128_t ret = 1;
    for (int i = 0; i < k; i++) {
        ret *= n;
    }
    return ret;
}

signed main() {
    i64 q;
    cin >> q;
    while (q--) {
        i64 n;
        cin >> n;
        if (n <= 2) {
            cout << "No" << endl;
        } else if (n % 2 == 0) {
            cout << "Yes" << endl;
        } else {
            int ok = 0;
            for (__int128_t i = 2; i < n; i <<= 1) {
                if (ok) break;
                i64 k = n - i;
//                cout << "checking " << i64(i) << " and " << k << endl;
                if (is_prime(k)) {
                    cout << "Yes" << endl;
                    ok = 1;
                    break;
                }
                if (!ok) {
                    for (int j = 2;; j++) {
                        int s = ksqrt(k, j);
                        if (s <= 2) break;
                        if (!is_prime(s)) continue;
                        if (powi(s, j) == k) {
                            cout << "Yes" << endl;
                            ok = 1;
                            break;
                        }
                    }
                }
            }
            
            if (!ok) {
                cout << "No" << endl;
            }
        }
    }
}
0