結果
問題 | No.3120 Lower Nim |
ユーザー |
![]() |
提出日時 | 2025-04-18 22:51:41 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 653 ms / 2,000 ms |
コード長 | 2,105 bytes |
コンパイル時間 | 5,848 ms |
コンパイル使用メモリ | 79,540 KB |
実行使用メモリ | 82,580 KB |
平均クエリ数 | 2685.91 |
最終ジャッジ日時 | 2025-04-18 22:52:10 |
合計ジャッジ時間 | 27,323 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 43 |
ソースコード
import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); String[] sa = br.readLine().split(" "); int[] a = new int[n]; for (int i = 0; i < n; i++) { a[i] = Integer.parseInt(sa[i]); } int[] c = new int[15]; for (int i = 0; i < n; i++) { int b = 1; for (int j = 0; j < c.length; j++) { c[j] += a[i] / b; b *= 2; } } int k = 100000000; boolean f = false; int nk = k; for (int i = 0; i < c.length; i++) { if (c[i] % 2 == 1) { f = true; nk = 1 << i; break; } } if (f) { System.out.println("First"); out(a, c, nk); int ret = Integer.parseInt(br.readLine()); if (ret != 0) { br.close(); return; } } else { System.out.println("Second"); } while (true) { sa = br.readLine().split(" "); int i = Integer.parseInt(sa[0]) - 1; int x = Integer.parseInt(sa[1]); int ret = Integer.parseInt(br.readLine()); if (ret != 0) { break; } int b = 1; for (int j = 0; j < c.length; j++) { c[j] -= a[i] / b; b *= 2; } a[i] -= x; b = 1; for (int j = 0; j < c.length; j++) { c[j] += a[i] / b; b *= 2; } k = x; for (int j = 0; j < c.length; j++) { if (c[j] % 2 == 1) { nk = 1 << j; break; } } if (nk > k) { for (int j = c.length - 1; j >= 0; j--) { nk = 1 << j; if (c[j] > 0 && nk <= k) { break; } } } out(a, c, nk); ret = Integer.parseInt(br.readLine()); if (ret != 0) { break; } } br.close(); } static void out(int[] a, int[] c, int nk) { for (int i = 0; i < a.length; i++) { if (a[i] >= nk) { int b = 1; for (int j = 0; j < c.length; j++) { c[j] -= a[i] / b; b *= 2; } a[i] -= nk; b = 1; for (int j = 0; j < c.length; j++) { c[j] += a[i] / b; b *= 2; } System.out.println((i + 1) + " " + nk); return; } } } }