結果
問題 | No.3030 ミラー・ラビン素数判定法のテスト |
ユーザー | mikit |
提出日時 | 2019-11-13 20:46:50 |
言語 | Java21 (openjdk 21) |
結果 |
WA
|
実行時間 | - |
コード長 | 11,463 bytes |
コンパイル時間 | 2,986 ms |
コンパイル使用メモリ | 92,936 KB |
実行使用メモリ | 57,524 KB |
最終ジャッジ日時 | 2024-11-18 17:40:32 |
合計ジャッジ時間 | 4,596 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 52 ms
50,540 KB |
testcase_01 | AC | 52 ms
50,392 KB |
testcase_02 | AC | 52 ms
50,172 KB |
testcase_03 | AC | 53 ms
50,324 KB |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
ソースコード
import java.io.OutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.UncheckedIOException; import java.util.Objects; import java.nio.charset.Charset; import java.util.StringTokenizer; import java.io.Writer; import java.io.OutputStreamWriter; import java.io.BufferedReader; import java.io.InputStream; /** * Built using CHelper plug-in * Actual solution is at the top * * @author mikit */ public class Main { public static void main(String[] args) { InputStream inputStream = System.in; OutputStream outputStream = System.out; LightScanner in = new LightScanner(inputStream); LightWriter out = new LightWriter(outputStream); Task solver = new Task(); solver.solve(1, in, out); out.close(); } static class Task { public void solve(int testNumber, LightScanner in, LightWriter out) { // out.setBoolLabel(LightWriter.BoolLabel.YES_NO_FIRST_UP); int n = in.ints(); for (int i = 0; i < n; i++) { long x = in.longs(); out.ans(x).ans(IntMath.isPrime(x) ? 1 : 0).ln(); } } } static interface Verified { } static class LightScanner { private BufferedReader reader = null; private StringTokenizer tokenizer = null; public LightScanner(InputStream in) { reader = new BufferedReader(new InputStreamReader(in)); } public String string() { if (tokenizer == null || !tokenizer.hasMoreTokens()) { try { tokenizer = new StringTokenizer(reader.readLine()); } catch (IOException e) { throw new UncheckedIOException(e); } } return tokenizer.nextToken(); } public int ints() { return Integer.parseInt(string()); } public long longs() { return Long.parseLong(string()); } } static class ModMath { private static final int DEFAULT_MOD = 1_000_000_007; private final long mod; public ModMath(long mod, boolean unsafe) { /*if (!unsafe && !IntMath.isPrime(mod)) { throw new RuntimeException("This class is designed for primes!"); }*/ this.mod = mod; } public ModMath(long mod) { this(mod, false); } public ModMath() { this(DEFAULT_MOD, true); } public long mod(long x) { x %= mod; return x < 0 ? x + mod : x; } public long inv(long x) { //return pow(x, mod - 2); return mod(LongEuclidSolver.solve(x, mod).x); } public long pow(long x, long y) { y %= (mod - 1); if (y < 0) { return pow(inv(x), -y); } else if (y == 0) { return 1; } else if (y % 2 == 0) { long z = pow(x, y / 2); return (z * z) % mod; } else { return (x % mod) * pow(x, y - 1) % mod; } } } static class LongEuclidSolver { private LongEuclidSolver() { } public static Vec3l solve(long a, long b) { LongEuclidSolver.ReferenceLong p = new LongEuclidSolver.ReferenceLong(), q = new LongEuclidSolver.ReferenceLong(); long d = solve(a, b, p, q); return new Vec3l(p.val, q.val, d); } private static long solve(long a, long b, LongEuclidSolver.ReferenceLong p, LongEuclidSolver.ReferenceLong q) { if (b == 0) { p.val = 1; q.val = 0; return a; } else { long d = solve(b, a % b, q, p); q.val -= (a / b) * p.val; return d; } } private static class ReferenceLong { private long val; } } static final class IntMath { private IntMath() { } public static boolean isPrime(int n) { if (n == 2) { return true; } else if (n <= 1 || (n & 1) == 0) { return false; } int r = BitMath.lsb(n - 1); int d = (n - 1) >> r; ModMath m = new ModMath(n, true); outer: for (int a : new int[]{2, 7, 61}) { int x = (int) m.pow(a, d); if (x == 1 || x == n - 1 || n - 2 < a) { continue; } for (int j = 1; j < r; j++) { x = (int) m.pow(x, 2); if (x == n - 1) { continue outer; } } return false; } return true; } public static boolean isPrime(long n) { if (n < Integer.MAX_VALUE) { return isPrime((int) n); } int s = BitMath.lsb(n - 1); long d = (n - 1) >> s; ModMath m = new ModMath(n); outer: for (long a : new long[]{2L, 325L, 9375L, 28178L, 450775L, 9780504L, 1795265022L}) { long r = m.pow(a, d); if (r == 1 || r == n - 1 || n - 2 < a) { continue; } for (int j = 0; j < s; j++) { r = m.pow(r, 2); if (r == n - 1) { continue outer; } } return false; } return true; } } static class Vec3i implements Comparable<Vec3i> { public int x; public int y; public int z; public Vec3i(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Vec3i vec3i = (Vec3i) o; return x == vec3i.x && y == vec3i.y && z == vec3i.z; } public int hashCode() { return Objects.hash(x, y, z); } public String toString() { return "(" + x + ", " + y + ", " + z + ")"; } public int compareTo(Vec3i o) { if (x == o.x) { if (y == o.y) { return Integer.compare(z, o.z); } return Integer.compare(y, o.z); } return Integer.compare(x, o.x); } } static final class BitMath { private BitMath() { } public static int count(int v) { v = (v & 0x55555555) + ((v >> 1) & 0x55555555); v = (v & 0x33333333) + ((v >> 2) & 0x33333333); v = (v & 0x0f0f0f0f) + ((v >> 4) & 0x0f0f0f0f); v = (v & 0x00ff00ff) + ((v >> 8) & 0x00ff00ff); v = (v & 0x0000ffff) + ((v >> 16) & 0x0000ffff); return v; } public static int count(long v) { v = (v & 0x5555555555555555L) + ((v >> 1) & 0x5555555555555555L); v = (v & 0x3333333333333333L) + ((v >> 2) & 0x3333333333333333L); v = (v & 0x0f0f0f0f0f0f0f0fL) + ((v >> 4) & 0x0f0f0f0f0f0f0f0fL); v = (v & 0x00ff00ff00ff00ffL) + ((v >> 8) & 0x00ff00ff00ff00ffL); v = (v & 0x0000ffff0000ffffL) + ((v >> 16) & 0x0000ffff0000ffffL); v = (v & 0x00000000ffffffffL) + ((v >> 32) & 0x00000000ffffffffL); return (int) v; } public static int lsb(int v) { if (v == 0) { throw new IllegalArgumentException("Bit not found"); } v |= (v << 1); v |= (v << 2); v |= (v << 4); v |= (v << 8); v |= (v << 16); return 32 - count(v); } public static int lsb(long v) { if (v == 0) { throw new IllegalArgumentException("Bit not found"); } v |= (v << 1); v |= (v << 2); v |= (v << 4); v |= (v << 8); v |= (v << 16); v |= (v << 32); return 64 - count(v); } } static class LightWriter implements AutoCloseable { private final Writer out; private boolean autoflush = false; private boolean breaked = true; public LightWriter(Writer out) { this.out = out; } public LightWriter(OutputStream out) { this(new BufferedWriter(new OutputStreamWriter(out, Charset.defaultCharset()))); } public LightWriter print(char c) { try { out.write(c); breaked = false; } catch (IOException ex) { throw new UncheckedIOException(ex); } return this; } public LightWriter print(String s) { try { out.write(s, 0, s.length()); breaked = false; } catch (IOException ex) { throw new UncheckedIOException(ex); } return this; } public LightWriter ans(String s) { if (!breaked) { print(' '); } return print(s); } public LightWriter ans(long l) { return ans(Long.toString(l)); } public LightWriter ans(int i) { return ans(Integer.toString(i)); } public LightWriter ln() { print(System.lineSeparator()); breaked = true; if (autoflush) { try { out.flush(); } catch (IOException ex) { throw new UncheckedIOException(ex); } } return this; } public void close() { try { out.close(); } catch (IOException ex) { throw new UncheckedIOException(ex); } } } static class Vec3l implements Comparable<Vec3l> { public long x; public long y; public long z; public Vec3l(long x, long y, long z) { this.x = x; this.y = y; this.z = z; } public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Vec3i vec3i = (Vec3i) o; return x == vec3i.x && y == vec3i.y && z == vec3i.z; } public int hashCode() { return Objects.hash(x, y, z); } public String toString() { return "(" + x + ", " + y + ", " + z + ")"; } public int compareTo(Vec3l o) { if (x == o.x) { if (y == o.y) { return Long.compare(z, o.z); } return Long.compare(y, o.z); } return Long.compare(x, o.x); } } }