結果
| 問題 |
No.8030 ミラー・ラビン素数判定法のテスト
|
| ユーザー |
do2424_titech
|
| 提出日時 | 2019-06-18 00:22:37 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,533 bytes |
| コンパイル時間 | 1,687 ms |
| コンパイル使用メモリ | 167,604 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-18 16:48:57 |
| 合計ジャッジ時間 | 20,820 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | WA * 10 |
ソースコード
#include <bits/stdc++.h>
unsigned long long sprp_base[] = { 2,3,5,7,11,13,17,19,23 };
//2, 325, 9375, 28178, 450775, 9780504, 1795265022
unsigned long long ll_product(unsigned long long a, unsigned long long b, unsigned long long r) {
unsigned long long ans = 0;
while (a != 0) {
if ((a & 1) == 1) {
ans = (ans + b) % r;
}
b = (b << 1) % r;
a >>= 1;
}
return ans;
}
unsigned long long ll_power(unsigned long long a, unsigned long long b, unsigned long long r) {
unsigned long long ans = 1;
while (b != 0) {
if ((b & 1) == 1) {
ans = ll_product(ans, a, r);
}
a = ll_product(a, a, r);
b >>= 1;
}
return ans;
}
bool primality_test(unsigned long long num) {
if (num == 2) {
return true;
}
if ((num & 1) == 0 || num == 1) {
return false;
}
unsigned long long d = (num - 1) >> 1;
int s = 1;
while ((d & 1) == 0) {
d >>= 1;
s++;
}
for (int k = 0; k < 9; k++) {
bool is_prime = false;
unsigned long long a = sprp_base[k];
if (num > a) {
unsigned long long r = ll_power(a, d, num);
if (r == 1 || r == num - 1) {
is_prime = true;
}
for (int i = 0; i < s; i++) {
r = ll_product(r, r, num);
if (r == num - 1) {
is_prime = true;
}
}
if (!is_prime) {
return false;
}
}
}
return true;
}
int main() {
int n;
std::cin >> n;
for (int i = 0; i < n; i++) {
unsigned long long hoge;
std::cin >> hoge;
if (primality_test(hoge) == true) {
std::cout << "1" << std::endl;
}
else {
std::cout << "0" << std::endl;
}
}
return 0;
}
do2424_titech