# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1114473 | vjudge1 | Osmosmjerka (COCI17_osmosmjerka) | C++14 | 865 ms | 72496 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define _for(i, a, b) for (int i = (a); i < (int)(b); ++i)
typedef unsigned int uint;
typedef long long LL;
typedef unsigned long long ULL;
const int D[][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0},
{1, -1}, {-1, 1}, {1, 1}, {-1, -1}},
NN = 500 + 4, LK = 21;
const uint Base[2] = {1183531, 1041221};
inline LL gcd(LL a, LL b) { return b == 0 ? a : gcd(b, a % b); }
int N, M;
LL K;
char S[NN][NN];
uint BP[2][LK + 4]; // BP[i,l]: Base[i]^(2^l)
struct HashVal {
uint h[2];
HashVal() { h[0] = h[1] = 0; }
inline void append(const HashVal &x, int len) {
_for(i, 0, 2) h[i] = (h[i] * BP[i][len]) + x.h[i];
}
ULL val() { return ((ULL)h[0] << 32) + h[1]; }
};
HashVal H[NN][NN][LK + 4];
unordered_map<ULL, int> HC;
int mod(int x, int md) { return ((x % md) % md + md) % md; }
int main() {
scanf("%d %d %lld\n", &N, &M, &K);
for (int i = 0; i < N; i++) scanf("%s", S[i]);
BP[0][0] = Base[0], BP[1][0] = Base[1];
for (int l = 1; l <= LK; l++)
_for(i, 0, 2) BP[i][l] = (BP[i][l - 1] * BP[i][l - 1]);
_for(i, 0, N) _for(j, 0, M) H[i][j][0].h[0] = H[i][j][0].h[1] = S[i][j] - 'a';
_for(di, 0, 8) {
int dx = D[di][0], dy = D[di][1];
LL len = 1;
for (int l = 1; l <= LK; l++) {
_for(x, 0, N) _for(y, 0, M) {
(H[x][y][l] = H[x][y][l - 1])
.append(H[mod(x + dx * len, N)][mod(y + dy * len, M)][l - 1],
l - 1);
}
len *= 2;
}
_for(x, 0, N) _for(y, 0, M) {
len = K;
HashVal h;
for (int l = LK, nx = x, ny = y; l >= 0; l--)
if ((1 << l) & len) {
len -= (1 << l), h.append(H[nx][ny][l], l);
nx = mod(nx + dx * (1 << l), N), ny = mod(ny + dy * (1 << l), M);
}
HC[h.val()]++;
}
}
LL x = 0, y = 1LL * (N * M * 8) * (N * M * 8);
for (auto p : HC) x += 1LL * (p.second) * (p.second);
LL g = gcd(x, y);
printf("%lld/%lld\n", x / g, y / g);
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |