結果
| 問題 |
No.1598 4×4 Grid
|
| コンテスト | |
| ユーザー |
629e^-b
|
| 提出日時 | 2021-07-10 10:06:06 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 676 ms / 4,000 ms |
| コード長 | 1,674 bytes |
| コンパイル時間 | 4,745 ms |
| コンパイル使用メモリ | 252,424 KB |
| 最終ジャッジ日時 | 2025-01-22 23:52:20 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 7 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pdd = pair<ld, ld>;
using pll = pair<ll, ll>;
using pli = pair<ll, int>;
using pil = pair<int, ll>;
template <typename T>
using Graph = vector<vector<T>>;
const int MOD = 1e9 + 7;
const ld PI = acos(-1);
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int K;
cin >> K;
vector<int> cnt(1 << 16);
for (int i = 0; i < (1 << 16); ++i) {
cnt[i] = __builtin_popcount(i);
}
int ofst = 200;
K += ofst;
vector<vector<ll>> dp(1 << 16, vector<ll>(505));
dp[0][ofst] = 1;
for (int i = 0; i < (1 << 16); ++i) {
int num = cnt[i];
for (int j = 0; j < 16; ++j) {
if ((i >> j) & 1)
continue;
int nxt = i | (1 << j);
int tmp = 0;
int y = j >> 2;
int x = j & 3;
if (x - 1 >= 0) {
tmp += ((i >> (j - 1)) & 1 ? num : -num);
}
if (y - 1 >= 0) {
tmp += ((i >> (j - 4)) & 1 ? num : -num);
}
if (x + 1 < 4) {
tmp += ((i >> (j + 1)) & 1 ? num : -num);
}
if (y + 1 < 4) {
tmp += ((i >> (j + 4)) & 1 ? num : -num);
}
for (int k = 0; k <= 500; ++k) {
if (k + tmp >= 0 && k + tmp <= 500) {
dp[nxt][k + tmp] += dp[i][k];
}
}
}
}
cout << dp[(1 << 16) - 1][K] << endl;
return 0;
}
629e^-b