結果
問題 | No.3030 ミラー・ラビン素数判定法のテスト |
ユーザー | unagiunag |
提出日時 | 2019-09-30 04:25:54 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 1,899 bytes |
コンパイル時間 | 799 ms |
コンパイル使用メモリ | 75,212 KB |
実行使用メモリ | 934,876 KB |
最終ジャッジ日時 | 2024-11-18 17:07:34 |
合計ジャッジ時間 | 72,888 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | MLE | - |
testcase_01 | MLE | - |
testcase_02 | MLE | - |
testcase_03 | MLE | - |
testcase_04 | TLE | - |
testcase_05 | TLE | - |
testcase_06 | TLE | - |
testcase_07 | TLE | - |
testcase_08 | TLE | - |
testcase_09 | TLE | - |
ソースコード
#include <vector> #include <iostream> #include <cassert> using namespace std; using lint = long long; class Prime { private: vector<int> min_pf; // min_pf[i] = minimum prime factor of i vector<int> prime; // linear sieve https://cp-algorithms.com/algebra/prime-sieve-linear.html void sieve(int N) { min_pf[0] = min_pf[1] = -1; for (int i = 2; i < N; i++) { if (min_pf[i] == 0) { prime.push_back(i); min_pf[i] = i; } for (int j = 0; j < (int)(prime.size()); ++j) { if (prime[j] > min_pf[i] || i * prime[j] >= N) break; min_pf[i * prime[j]] = prime[j]; } } } public: Prime(int N = 110000000) : min_pf(N + 1) { assert(3 <= N); sieve(N + 1); } vector<pair<lint, int>> factorize(lint n) { vector<pair<lint, int>> res; for (lint i = 2; i * i <= n; i++) { if (n < (lint)min_pf.size()) break; int cnt = 0; while (n % i == 0) { cnt++; n /= i; } if (cnt) res.emplace_back(i, cnt); } if (n >= (lint)min_pf.size()) res.emplace_back(n, 1); else { int prev = min_pf[n], cnt = 0; while (n != 1) { int now = min_pf[n]; n /= now; cnt++; if (prev != now) { res.emplace_back(prev, cnt); prev = now; cnt = 0; } } } return res; } // verified using boost miller_rabin_test https://wandbox.org/permlink/6YepW3J9SQNFwWxu bool isPrime(lint n) { if (n < (int)(min_pf.size())) return min_pf[n] == n; else if (n % 2 == 0 || n % 3 == 0) return false; else if (n % 6 != 1 && n % 6 != 5) return false; for (lint i = 5; i * i <= n; i += 6) { if (n % i == 0) return false; if (n % (i + 2) == 0) return false; } return true; } }; int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int N; cin >> N; vector<lint> x(N); for(int i = 0; i < N; i++) cin >> x[i]; Prime p; for(int i = 0; i < N; i++) cout << x[i] << " " << p.isPrime(x[i]) << "\n"; }