結果
問題 | No.8056 量子コンピュータで素因数分解 Easy |
ユーザー | Ark |
提出日時 | 2020-02-06 03:06:57 |
言語 | D (dmd 2.106.1) |
結果 |
AC
|
実行時間 | 130 ms / 2,000 ms |
コード長 | 3,658 bytes |
コンパイル時間 | 2,362 ms |
コンパイル使用メモリ | 184,356 KB |
実行使用メモリ | 25,348 KB |
平均クエリ数 | 2.42 |
最終ジャッジ日時 | 2024-06-22 04:52:43 |
合計ジャッジ時間 | 6,204 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 51 ms
24,556 KB |
testcase_01 | AC | 56 ms
24,556 KB |
testcase_02 | AC | 125 ms
24,812 KB |
testcase_03 | AC | 123 ms
25,220 KB |
testcase_04 | AC | 58 ms
24,836 KB |
testcase_05 | AC | 57 ms
25,220 KB |
testcase_06 | AC | 57 ms
24,832 KB |
testcase_07 | AC | 57 ms
25,220 KB |
testcase_08 | AC | 63 ms
25,220 KB |
testcase_09 | AC | 64 ms
25,220 KB |
testcase_10 | AC | 63 ms
25,220 KB |
testcase_11 | AC | 59 ms
24,964 KB |
testcase_12 | AC | 73 ms
24,580 KB |
testcase_13 | AC | 65 ms
25,220 KB |
testcase_14 | AC | 70 ms
25,232 KB |
testcase_15 | AC | 81 ms
24,580 KB |
testcase_16 | AC | 79 ms
25,348 KB |
testcase_17 | AC | 81 ms
24,836 KB |
testcase_18 | AC | 107 ms
24,836 KB |
testcase_19 | AC | 130 ms
25,220 KB |
testcase_20 | AC | 112 ms
24,580 KB |
testcase_21 | AC | 78 ms
24,836 KB |
testcase_22 | AC | 77 ms
24,568 KB |
testcase_23 | AC | 91 ms
25,208 KB |
testcase_24 | AC | 85 ms
25,220 KB |
testcase_25 | AC | 52 ms
25,220 KB |
コンパイルメッセージ
/home/linuxbrew/.linuxbrew/opt/dmd/include/dlang/dmd/std/numeric.d(3130): Warning: cannot inline function `std.numeric.gcdImpl!(BigInt).gcdImpl`
ソースコード
module yukicoder.p3056; import std.stdio; import std.string; import std.format; import std.conv; import std.typecons; import std.algorithm; import std.functional; import std.bigint; import std.numeric; import std.array; import std.math; import std.range; import std.container; import std.concurrency; import std.traits; import std.uni; import core.bitop : popcnt; alias Generator = std.concurrency.Generator; import std.random; void main() { auto rnd = Random(unpredictableSeed); BigInt n = readln.chomp.to!BigInt; while(true) { BigInt a = uniform!("[]", ulong)(1, min(n-1, ulong.max.to!BigInt).to!ulong, rnd).to!BigInt; if (gcd(a, n) != 1) continue; BigInt r = query(a, n); if (r&1) continue; BigInt b = a.powmod(r>>1, n); BigInt p = gcd(b+1, n); BigInt q = gcd(b-1, n); if (p == n || q == n) continue; answer(p, q); break; } } BigInt query(BigInt a, BigInt n) { writeln("? ", a); stdout.flush; debug { BigInt r = 0; BigInt b = 1; while(true) { b = b*a%n; r++; if (b == 1) { return r; } } assert(false); } else { return readln.chomp.to!BigInt; } } void answer(BigInt p, BigInt q) { writeln("! ", p, " ", q); } // ---------------------------------------------- void times(alias fun)(long n) { // n.iota.each!(i => fun()); foreach(i; 0..n) fun(); } auto rep(alias fun, T = typeof(fun()))(long n) { // return n.iota.map!(i => fun()).array; T[] res = new T[n]; foreach(ref e; res) e = fun(); return res; } T ceil(T)(T x, T y) if (isIntegral!T || is(T == BigInt)) { // `(x+y-1)/y` will only work for positive numbers ... T t = x / y; if (y > 0 && t * y < x) t++; if (y < 0 && t * y > x) t++; return t; } T floor(T)(T x, T y) if (isIntegral!T || is(T == BigInt)) { T t = x / y; if (y > 0 && t * y > x) t--; if (y < 0 && t * y < x) t--; return t; } ref T ch(alias fun, T, S...)(ref T lhs, S rhs) { return lhs = fun(lhs, rhs); } unittest { long x = 1000; x.ch!min(2000); assert(x == 1000); x.ch!min(3, 2, 1); assert(x == 1); x.ch!max(100).ch!min(1000); // clamp assert(x == 100); x.ch!max(0).ch!min(10); // clamp assert(x == 10); } mixin template Constructor() { import std.traits : FieldNameTuple; this(Args...)(Args args) { // static foreach(i, v; args) { foreach(i, v; args) { mixin("this." ~ FieldNameTuple!(typeof(this))[i]) = v; } } } void scanln(Args...)(auto ref Args args) { enum sep = " "; enum n = Args.length; enum fmt = n.rep!(()=>"%s").join(sep); string line = readln.chomp; static if (__VERSION__ >= 2074) { line.formattedRead!fmt(args); } else { enum argsTemp = n.iota.map!( i => "&args[%d]".format(i) ).join(", "); mixin( "line.formattedRead(fmt, " ~ argsTemp ~ ");" ); } } // fold was added in D 2.071.0 static if (__VERSION__ < 2071) { template fold(fun...) if (fun.length >= 1) { auto fold(R, S...)(R r, S seed) { static if (S.length < 2) { return reduce!fun(seed, r); } else { return reduce!fun(tuple(seed), r); } } } } // popcnt with ulongs was added in D 2.071.0 static if (__VERSION__ < 2071) { ulong popcnt(ulong x) { x = (x & 0x5555555555555555L) + (x>> 1 & 0x5555555555555555L); x = (x & 0x3333333333333333L) + (x>> 2 & 0x3333333333333333L); x = (x & 0x0f0f0f0f0f0f0f0fL) + (x>> 4 & 0x0f0f0f0f0f0f0f0fL); x = (x & 0x00ff00ff00ff00ffL) + (x>> 8 & 0x00ff00ff00ff00ffL); x = (x & 0x0000ffff0000ffffL) + (x>>16 & 0x0000ffff0000ffffL); x = (x & 0x00000000ffffffffL) + (x>>32 & 0x00000000ffffffffL); return x; } }