結果
| 問題 | 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();
}
}