結果

問題 No.36 素数が嫌い!
ユーザー @abcde@abcde
提出日時 2019-06-01 23:01:44
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 101 ms / 5,000 ms
コード長 1,774 bytes
コンパイル時間 1,670 ms
コンパイル使用メモリ 173,148 KB
実行使用メモリ 4,348 KB
最終ジャッジ日時 2023-10-17 22:51:41
合計ジャッジ時間 4,471 ms
ジャッジサーバーID
(参考情報)
judge11 / judge15
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 48 ms
4,348 KB
testcase_01 AC 79 ms
4,348 KB
testcase_02 AC 2 ms
4,348 KB
testcase_03 AC 2 ms
4,348 KB
testcase_04 AC 2 ms
4,348 KB
testcase_05 AC 3 ms
4,348 KB
testcase_06 AC 2 ms
4,348 KB
testcase_07 AC 2 ms
4,348 KB
testcase_08 AC 2 ms
4,348 KB
testcase_09 AC 2 ms
4,348 KB
testcase_10 AC 2 ms
4,348 KB
testcase_11 AC 34 ms
4,348 KB
testcase_12 AC 101 ms
4,348 KB
testcase_13 AC 101 ms
4,348 KB
testcase_14 AC 64 ms
4,348 KB
testcase_15 AC 2 ms
4,348 KB
testcase_16 AC 1 ms
4,348 KB
testcase_17 AC 2 ms
4,348 KB
testcase_18 AC 2 ms
4,348 KB
testcase_19 AC 40 ms
4,348 KB
testcase_20 AC 101 ms
4,348 KB
testcase_21 AC 78 ms
4,348 KB
testcase_22 AC 80 ms
4,348 KB
testcase_23 AC 49 ms
4,348 KB
testcase_24 AC 54 ms
4,348 KB
testcase_25 AC 53 ms
4,348 KB
testcase_26 AC 62 ms
4,348 KB
testcase_27 AC 87 ms
4,348 KB
testcase_28 AC 61 ms
4,348 KB
testcase_29 AC 98 ms
4,348 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using LL = long long;

// 与えられた正の整数のすべての約数を抽出.
// @param X: 約数を抽出したい正の整数.
// @return ret: すべての約数.
vector<LL> div(LL X){
    vector<LL> ret;
    ret.push_back(1);
    for(LL d = 2; d * d <= X; d++) {
        if(X % d == 0) {
            ret.push_back(d);
            if(d * d != X) ret.push_back(X / d);
        }
    }
    ret.push_back(X);
    sort(ret.begin(), ret.end());
    return ret;
}

int main() {
    
    // 1. 入力情報取得.
    LL N;
    scanf("%llu", &N);
    
    // 2. N を 素因数分解.
    vector<LL> divisors = div(N);
    // for(auto &p : divisors) cout << p << " ";
    
    // 3. 友達の前で使っても良い整数であるか確認.
    // ex.
    // N = 4
    // 1, 2, 4 -> NO
    // 
    // N = 27
    // 1, 3, 9, 27 -> YES
    // 
    // N = 99999640000243
    // 1, 9999973, 9999991, 99999640000243 -> NO
    // 
    // -> 1 と 自身 以外について, 以下の判定を入れればよいかどうか?
    // ① サイズ が 3以上 ならば, OK.
    // ② サイズ が 2     ならば, a < b と置いたとき, b =  a * a ならば, OK.
    // ③ サイズ が 2     ならば, a < b と置いたとき, b != a * a ならば, NG.
    // ④ サイズ が 1以下 ならば, NG.
    bool ans = false;
    if(divisors.size() >= 5) ans = true;
    if(divisors.size() == 4){
        LL a = divisors[1];
        LL b = divisors[2];
        // cout << a << " " << b << endl;
        if(b == a * a) ans = true;
        else           ans = false;
    }
    if(divisors.size() <= 3) ans = false;

    // 4. 後処理.
    if(ans) printf("%s\n", "YES");
    else    printf("%s\n", "NO");
    return 0;
    
}
0