Submission #2945123
Source Code Expand
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define MOD 998244353
#define ADD(X,Y) ((X) = ((X) + (Y)%MOD) % MOD)
typedef long long i64; typedef vector<int> ivec; typedef vector<string> svec;
int H, W;
// mask * H + i
int id(int mask, int i)
{
return mask;
}
pair<int, int> trans(int i, int mask, int nxt)
{
if (mask & (1 << i)) {
int ca = -1, cb = -1;
if (nxt == 1) ca = id(mask ^ (1 << i), (i + 1) % H);
if (mask & (1 << (i + 1))) cb = id((mask ^ (1 << (i + 1)) ^ (1 << i)) | (nxt << i), (i + 1) % H);
if (ca == -1 && cb != -1) swap(ca, cb);
return { ca, cb };
} else {
return { id(mask | (nxt << i), (i + 1) % H), -1 };
}
}
int idl[5];
map<set<int>, int> S[5];
int nxt[5][2000][2];
set<int> reachable_set(set<int> cur, int n, int i)
{
set<int> reachable;
for (int mask : cur) {
auto nxt = trans(i, mask, n);
if (nxt.first != -1) reachable.insert(nxt.first);
if (nxt.second != -1) reachable.insert(nxt.second);
}
return reachable;
}
int construct(set<int> cur, int i)
{
if (S[i].count(cur)) return S[i][cur];
int id = idl[i]++;
S[i].insert({ cur, id });
// printf("%d; ", i);
// for (int mask : cur) printf("%d ", mask);
// puts("");
S[i].insert({ cur, 0 });
for (int n = 0; n < 2; ++n) {
set<int> reachable = reachable_set(cur, n, i);
/*
printf("%d; ", i);
for (int mask : cur) printf("%d ", mask);
printf("-> %d; ", (i + 1) % H);
for (int mask : reachable) printf("%d ", mask);
puts("");
*/
nxt[i][id][n] = construct(reachable, (i + 1) % H);
}
return id;
}
int tr[260][32];
const int SIZE = 260;
struct matrix {
i64 val[SIZE][SIZE];
matrix() {
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
val[i][j] = 0;
}
}
}
};
matrix operator*(const matrix& a, const matrix& b)
{
matrix ret;
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
i64 tmp = 0;
for (int k = 0; k < SIZE; ++k) {
tmp += a.val[i][k] * b.val[k][j];
if (k % 8 == 7) tmp %= MOD;
}
ret.val[i][j] = tmp % MOD;
}
}
return ret;
}
bool isokcheck(int mask)
{
for (int i = 0; i < H; ++i) {
if (mask & (1 << i)) {
if (mask & (1 << (i + 1))) {
mask ^= (1 << i);
mask ^= (1 << (i + 1));
} else return false;
}
}
return true;
}
int main()
{
scanf("%d%d", &H, &W);
// powerset construction
set<int> def;
def.insert(0);
for (int i = 0; i < H; ++i) idl[i] = 0;
construct(def, 0);
int E = S[0].size();
for (int i = 0; i < E; ++i) {
for (int j = 0; j < (1 << H); ++j) {
int p = i;
for (int k = 0; k < H; ++k) {
p = nxt[k][p][(j >> k) & 1];
}
tr[i][j] = p;
}
}
matrix M;
for (int i = 0; i < E; ++i) {
for (int j = 0; j < (1 << H); ++j) {
M.val[i][tr[i][j]] += 1;
}
}
matrix sol = M;
for (int i = 0; i < 30; ++i) {
if (((W - 1) >> i) & 1) {
sol = sol * M;
}
M = M * M;
}
i64 ret = 0;
for (auto ttt : S[0]) {
auto s = ttt.first;
int id = ttt.second;
bool isok = false;
for (int v : s) {
if (isokcheck(v)) isok = true;
}
if (isok) ADD(ret, sol.val[0][id]);
}
printf("%lld\n", ret);
return 0;
}
Submission Info
Submission Time
2018-08-04 22:27:50+0900
Task
H - タイル張り
User
semiexp
Language
C++14 (GCC 5.4.1)
Score
1000
Code Size
3448 Byte
Status
AC
Exec Time
1680 ms
Memory
2304 KB
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:132:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &H, &W);
^
Judge Result
Set Name
Sample
All
Score / Max Score
0 / 0
1000 / 1000
Status
Set Name
Test Cases
Sample
s1.txt, s2.txt, s3.txt
All
01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, s1.txt, s2.txt, s3.txt
Case Name
Status
Exec Time
Memory
01.txt
AC
1455 ms
2304 KB
02.txt
AC
856 ms
2304 KB
03.txt
AC
1198 ms
2304 KB
04.txt
AC
1258 ms
2304 KB
05.txt
AC
1253 ms
2304 KB
06.txt
AC
885 ms
2304 KB
07.txt
AC
882 ms
1920 KB
08.txt
AC
1194 ms
1920 KB
09.txt
AC
1219 ms
1920 KB
10.txt
AC
1450 ms
1920 KB
11.txt
AC
1135 ms
1920 KB
12.txt
AC
1251 ms
1792 KB
13.txt
AC
1568 ms
2304 KB
14.txt
AC
1422 ms
1792 KB
15.txt
AC
1452 ms
1792 KB
16.txt
AC
851 ms
1792 KB
17.txt
AC
885 ms
2304 KB
18.txt
AC
882 ms
1792 KB
19.txt
AC
853 ms
1792 KB
20.txt
AC
1653 ms
2304 KB
21.txt
AC
1680 ms
2304 KB
22.txt
AC
1654 ms
2304 KB
s1.txt
AC
883 ms
1792 KB
s2.txt
AC
910 ms
1920 KB
s3.txt
AC
969 ms
2304 KB