結果
問題 |
No.1106 🦉 何事もバランスが大事
|
ユーザー |
|
提出日時 | 2018-12-15 17:25:12 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 166 ms / 2,000 ms |
コード長 | 2,095 bytes |
コンパイル時間 | 4,691 ms |
コンパイル使用メモリ | 79,856 KB |
実行使用メモリ | 42,624 KB |
最終ジャッジ日時 | 2024-11-23 18:28:30 |
合計ジャッジ時間 | 19,455 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 77 |
ソースコード
import java.io.*; import java.util.*; import java.util.stream.*; import static java.lang.Math.*; public class Main { Integer[] conv(long x, int base) { List<Integer> v = new ArrayList<>(); while(x != 0) { int rem = (int)(x % base); if(rem > base / 2) { rem -= base; } v.add(rem); x -= rem; x /= base; } Collections.reverse(v); return v.toArray(new Integer[0]); } private long f(long x) { Integer[] a = conv(x, 5); int n = a.length; // dp[未満フラグ][先行ゼロを抜けたか][荷物側の分銅数][反対側の分銅数] := パターン数 long[][][][] dp = new long[2][2][n+1][n+1]; dp[0][0][0][0] = 1; for(int i=0; i<n; ++i) { long[][][][] ndp = new long[2][2][n+1][n+1]; for(int less=0; less<2; ++less) { for(int nuke0=0; nuke0<2; ++nuke0) { for(int cntM=0; cntM<=n; ++cntM) { for(int cntP=0; cntP<=n; ++cntP) { if(dp[less][nuke0][cntM][cntP] == 0) { continue; } // [l, r] int l = nuke0==1 ? -2 : 0, r = less ==1 ? 2 : a[i]; for(int d=l; d<=r; ++d) { int nless = less ==1 || d < a[i] ? 1 : 0, n_nuke0 = nuke0==1 || d > 0 ? 1 : 0, ncntM = cntM + (d < 0 ? -d : 0), ncntP = cntP + (d > 0 ? d : 0); if(ncntM > n) { continue; } if(ncntP > n) { continue; } ndp[nless][n_nuke0][ncntM][ncntP] += dp[less][nuke0][cntM][cntP]; } } } } } dp = ndp; } long res = 0; for(int less=0; less<2; ++less) { for(int nuke0=0; nuke0<2; ++nuke0) { for(int cnt=1; cnt<=n; ++cnt) { res += dp[less][nuke0][cnt][cnt]; } } } return res; } private void solve() { Scanner sc = new Scanner(System.in); long N = sc.nextLong(); long res = f(N); System.out.println(res); } public static void main(String[] args) { new Main().solve(); } }