結果
問題 |
No.3070 Collecting Coins Speedrun 2
|
ユーザー |
|
提出日時 | 2025-03-21 23:03:27 |
言語 | D (dmd 2.109.1) |
結果 |
AC
|
実行時間 | 22 ms / 2,000 ms |
コード長 | 1,739 bytes |
コンパイル時間 | 1,485 ms |
コンパイル使用メモリ | 163,896 KB |
実行使用メモリ | 7,324 KB |
最終ジャッジ日時 | 2025-03-21 23:03:33 |
合計ジャッジ時間 | 3,315 ms |
ジャッジサーバーID (参考情報) |
judge7 / judge6 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 32 |
ソースコード
import std; void main () { int N = readln.chomp.to!int; auto c = readln.split.to!(int[]); const long MOD = 998244353; int minus = 0, plus = 0; bool zero = false; foreach (v; c) { if (v < 0) minus++; if (0 < v) plus++; if (v == 0) zero = true; } if (minus == 0 && plus == 0) { writeln(1); return; } if (minus == 0) { long ans = mod_pow(2, plus - 1, MOD); if (zero) { ans *= 2; ans %= MOD; } writeln(ans); return; } if (plus == 0) { long ans = mod_pow(2, minus - 1, MOD); if (zero) { ans *= 2; ans %= MOD; } writeln(ans); return; } long ans = 0; long m = mod_pow(2, minus - 1, MOD); long p = mod_pow(2, plus - 1, MOD); // plus -> minus // minus -> plus // が基本パターンで、0をとるタイミングは各3箇所 ans = 2 * m * p % MOD; if (zero) { ans *= 3; ans %= MOD; } writeln(ans); } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } } long mod_pow (long a, long x, const long MOD) in { assert(0 <= x, "x must satisfy 0 <= x"); assert(1 <= MOD, "MOD must satisfy 1 <= MOD"); assert(MOD <= int.max, "MOD must satisfy MOD*MOD <= long.max"); } do { // normalize a %= MOD; a += MOD; a %= MOD; long res = 1L; long base = a; while (0 < x) { if (0 < (x&1)) (res *= base) %= MOD; (base *= base) %= MOD; x >>= 1; } return res % MOD; }