結果
| 問題 | No.2991 Hypercubic Graph Flow |
| コンテスト | |
| ユーザー |
とりゐ
|
| 提出日時 | 2024-12-15 11:17:49 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 145 ms / 2,000 ms |
| コード長 | 2,199 bytes |
| 記録 | |
| コンパイル時間 | 3,277 ms |
| コンパイル使用メモリ | 258,240 KB |
| 実行使用メモリ | 13,568 KB |
| 最終ジャッジ日時 | 2024-12-15 11:17:57 |
| 合計ジャッジ時間 | 4,975 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
// solved by Dispersion
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
template<class T>
bool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>
bool chmin(T &a, const T &b) { if (b < a) { a = b; return 1; } return 0; }
vector<vector<ll>> bai(vector<vector<ll>> &A, bool mul)
{
ll n = A.size();
vector<vector<ll>> ret(2 * n, vector<ll>(2 * n, 0));
// ret = {{A, I}, {I, A}} 的な
for (int i = 0; i < n ; ++i)
{
for (int j = 0; j < n; ++j)
{
ret[i][j] = A[i][j];
ret[n+i][n+j] = A[i][j] * (-1);
}
}
for (int i = 0; i < n; ++i)
{
ret[i][n+i] = (i % 2 == 0 ? 1 : -1);
if (mul && i < n/2) {ret[i][n+i] *= -1;}
ret[n+i][i] = -ret[i][n+i];
}
return ret;
}
bool judge(vector<vector<ll>> &A)
{
ll M = A.size();
// check
for (int i = 0; i < M; ++i)
{
ll row_sum = 0;
for (int j = 0; j < M; ++j)
{
if (__builtin_popcount(i^j) == 1 ^ A[i][j] != 0)
{
return false;
}
if (A[i][j] + A[j][i] != 0)
{
return false;
}
row_sum += A[i][j];
}
if (row_sum != 0)
{
cout << i << " " << row_sum << endl;
return false;
}
}
return true;
}
int main()
{
ll N; cin >> N;
ll M = (1LL<<N);
if (N == 1)
{
cout << "No" << endl;
return 0;
}
vector<vector<ll>> ans;
if (N % 2 == 0)
{
vector<vector<ll>> m2 = {
{0, 1, -1, 0},
{-1, 0, 0, 1},
{1, 0, 0, -1},
{0, -1, 1, 0}
};
ans = m2;
ll t = (N - 2) / 2;
while (t--)
{
ans = bai(ans, false);
ans = bai(ans, true);
}
}
else
{
vector<vector<ll>> m3 = {
{0, 1, 1, 0, -2, 0, 0, 0},
{-1, 0, 0, -1, 0, 2, 0, 0},
{-1, 0, 0, -1, 0, 0, 2, 0},
{0, 1, 1, 0, 0, 0, 0, -2},
{2, 0, 0, 0, 0, -1, -1, 0},
{0, -2, 0, 0, 1, 0, 0, 1},
{0, 0, -2, 0, 1, 0, 0, 1},
{0, 0, 0, 2, 0, -1, -1, 0}
};
ans = m3;
ll t = (N - 3) / 2;
while (t--)
{
ans = bai(ans, false);
ans = bai(ans, true);
}
}
// output
cout << "Yes" << endl;
for (int i = 0; i < M; ++i)
{
for (int j = 0; j < M; ++j)
{
cout << ans[i][j] << " ";
}
cout << endl;
}
// judge
bool flg = judge(ans);
return 0;
}
とりゐ