// https://oj.uz/problem/view/COCI17_osmosmjerka
#ifndef DEBUG
#pragma GCC optimize("Ofast,unroll-loops")
#endif
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/trie_policy.hpp>
#if defined(DEBUG) && defined(DEBUG_UTIL)
#include "dsa_util.h"
#endif
// clang-format off
using namespace std;
using namespace __gnu_pbds;
using uint = unsigned int;
using ll = long long;
using ull = unsigned long long;
constexpr int INF = 0x3f3f3f3f;
constexpr ll INFL = 0x3f3f3f3f3f3f3f3fLL;
constexpr double EPS = 1e-9;
constexpr int dx[8] = {1, -1, 0, 0, 1, 1, -1, -1};
constexpr int dy[8] = {0, 0, 1, -1, 1, -1, 1, -1};
constexpr int drev[8] = {1, 0, 3, 2, 7, 6, 5, 4};
constexpr int drotl[8] = {2, 3, 1, 0, 6, 4, 7, 5};
constexpr int drotr[8] = {3, 2, 0, 1, 5, 7, 4, 6};
constexpr char dn_nsew[4] = {'S', 'N', 'E', 'W'};
constexpr char dn_udrl[4] = {'D', 'U', 'R', 'L'};
unordered_map<char, int> dm_nsew = {{'S', 0}, {'N', 1}, {'E', 2}, {'W', 3}};
unordered_map<char, int> dm_udrl = {{'D', 0}, {'U', 1}, {'R', 2}, {'L', 3}};
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#if __cplusplus < 202002L
template <typename T> int popcount(T x); template <> int popcount(uint x) { return __builtin_popcount(x); } template <> int popcount(ull x) { return __builtin_popcountll(x); }
template <typename T> int countl_zero(T x); template <> int countl_zero(uint x) { return __builtin_clz(x); } template <> int countl_zero(ull x) { return __builtin_clzll(x); }
template <typename T> int countr_zero(T x); template <> int countr_zero(uint x) { return __builtin_ctz(x); } template <> int countr_zero(ull x) { return __builtin_ctzll(x); }
template <typename T> int bit_width(T x) { return numeric_limits<T>::digits - countl_zero(x); }
#endif
template <typename T> int sgn(T x) { return (T(0) < x) - (x < T(0)); }
template <typename T> T randint(T l, T r) { return uniform_int_distribution<T>(l, r)(rng); }
template <typename T> T randf(T l, T r) { return uniform_real_distribution<T>(l, r)(rng); }
template <typename T> int log2if(T x) { return bit_width(x + 0ULL) - 1; }
template <typename T> int log2ic(T x) { return bit_width(x - 1ULL); }
bool inside(int x, int y, int n, int m) { return x >= 0 && x < n && y >= 0 && y < m; }
ll sqdist(const pair<int, int> &p, const pair<int, int> &q) { ll x = p.first - q.first, y = p.second - q.second; return x * x + y * y; }
template <typename T> using min_priority_queue = priority_queue<T, vector<T>, greater<>>;
template <typename T, typename Comp = less<>> using ordered_set = tree<T, null_type, Comp, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T = null_type> using pref_trie = trie<string, T, trie_string_access_traits<>, pat_trie_tag, trie_prefix_search_node_update>;
#if __cplusplus >= 201703L
template <typename, typename = void> struct is_iterable : false_type {};
template <typename T> struct is_iterable<T, void_t<decltype(declval<T>().begin()), decltype(declval<T>().end())>> : true_type {};
template <> struct is_iterable<string> : false_type {};
template <typename T> constexpr bool is_iterable_v = is_iterable<T>::value;
template <typename T, typename V = enable_if_t<is_iterable_v<T>, typename T::value_type>> ostream &operator<<(ostream &os, const T &t) { for (const V &v : t) os << v << ' '; return os; }
template <typename T, typename U> ostream &operator<<(ostream &os, const pair<T, U> &p) { return os << '(' << p.first << ' ' << p.second << ')'; }
void dbg_header_(const char *f, int l, const char *e) { cout << "\033[35m(" << f << ':' << l << ") \033[1m" << e << ":\033[0m "; }
template <typename T, typename = enable_if_t<!is_iterable_v<T>>> void dbg_(const T &t, const char *f, int l, const char *e) { dbg_header_(f, l, e); cout << "\033[33;1m" << t << "\033[0m" << endl; }
template <typename T, typename V = enable_if_t<is_iterable_v<T> && !is_iterable_v<typename T::value_type>, typename T::value_type>, typename = void> void dbg_(const T &t, const char *f, int l, const char *e) { dbg_header_(f, l, e); cout << "\033[33;1m"; for (const V &v : t) cout << v << ' '; cout << "\033[0m" << endl; }
template <typename T, typename = enable_if_t<is_iterable_v<T> && is_iterable_v<typename T::value_type>, typename T::value_type>, typename = void, typename = void> void dbg_(const T &t, const char *f, int l, const char *e) { dbg_header_(f, l, e); cout << '\n'; for (int i = 0; i < t.size(); i++) cout << "\033[36m" << i << ":\033[33;1m " << t[i] << "\033[0m" << endl; }
#ifdef DEBUG
#define dbg(t) dbg_((t), __func__, __LINE__, #t)
#else
#define dbg(t)
#endif
#endif
// clang-format on
constexpr ull M = (1ULL << 61) - 1;
ull mul(ull a, ull b)
{
ull l1 = uint(a), h1 = a >> 32, l2 = uint(b), h2 = b >> 32;
ull l = l1 * l2, m = l1 * h2 + l2 * h1, h = h1 * h2;
ull ans = (l & M) + (l >> 61) + (h << 3) + (m >> 29) + (m << 35 >> 3) + 1;
ans = (ans & M) + (ans >> 61);
ans = (ans & M) + (ans >> 61);
return ans - 1;
}
ull pow(ull n, ull p, ull m)
{
ull ans = 1;
while (p > 0)
{
if (p & 1)
ans = ans * n % m;
n = n * n % m;
p >>= 1;
}
return ans;
}
void solve()
{
#ifdef DEBUG
cout << "\033[31;1m======================================================================\033[0m" << endl;
#endif
int m, n, k;
cin >> m >> n >> k;
vector<string> grid(m);
for (string &s : grid)
cin >> s;
int log = log2if(k);
ull base = randint<ull>(69ULL, 696969696969ULL);
vector dp(log + 1, vector(m, vector(n, vector<ull>(8))));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
for (int d = 0; d < 8; d++)
dp[0][i][j][d] = grid[i][j];
}
}
for (int l = 1; l <= log; l++)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
for (int d = 0; d < 8; d++)
{
int amt = 1 << l - 1;
int ni = ((i + dx[d] * amt) % m + m) % m, nj = ((j + dy[d] * amt) % n + n) % n;
dp[l][i][j][d] = (dp[l - 1][i][j][d] + mul(pow(base, amt, M), dp[l - 1][ni][nj][d])) % M;
}
}
}
}
map<ull, int> freq;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
for (int d = 0; d < 8; d++)
{
int amt = 0;
ull h = 0;
for (int l = 0; l <= log; l++)
{
if (!(k & 1 << l))
continue;
int ni = ((i + dx[d] * amt) % m + m) % m, nj = ((j + dy[d] * amt) % n + n) % n;
h = (h + mul(pow(base, amt, M), dp[l][ni][nj][d])) % M;
amt += 1 << l;
}
freq[h]++;
}
}
}
ll ways = 0;
for (int c : freq | views::values)
ways += ll(c) * c;
ll denom = m * n * 8;
denom *= denom;
ll g = gcd(ways, denom);
ways /= g;
denom /= g;
cout << ways << '/' << denom << endl;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin >> t;
while (t--)
solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |