#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define all(a) a.begin(), a.end()
#define pii pair<int,int>
#define el '\n'
typedef vector<vector<int>> matrix;
const int maxN = 505;
const int base = 311;
const int MOD = 1000000003;
const int base2 = 307;
const int MOD2 = 1000000007;
const int INF = 1e15;
const int NEG_INF = -1e15;
const int LOG = 20;
int n, q, m, a, b, t, k, C;
string s;
// int dist[maxN];
int A[maxN], B[maxN];
int match[maxN], parent[maxN], block[maxN];
bool visited[maxN];
int fac[maxN];
int cntT[30], cntS[30];
int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
int H[205][205], H2[maxN], R[maxN], power[maxN], power2[maxN], pb1[LOG], pb2[LOG];
string SS[maxN];
string S, T;
int getHash( int i, int j, const int H[]){
if(i > j) return 0;
return (H[j] - H[i-1] * power[j-i+1] + MOD*MOD) % MOD;
}
int getHash2( int i, int j){
return (H2[j] - H2[i-1] * power2[j-i+1] + MOD2*MOD2) % MOD2;
}
// int getHashT( int i, int j ){
// return (R[j] - R[i-1] * power[j-i+1] + MOD*MOD) % MOD;
// }
int add(int a, int b, int mod) {
return (a + b) % mod;
}
int mul(int a, int b, int mod) {
return (a * b) % mod;
}
pii dp[LOG][maxN][maxN];
vector<pii> final_hashes;
void solve_dir(int dir){
int dr = dx[dir];
int dc = dy[dir];
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
dp[0][i][j] = {SS[i][j], SS[i][j]};
}
}
int cur_len = 1; // 2^0
for (int p = 1; p < LOG; p++) {
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
int step_r = (dr * (cur_len % m)) % m;
int ni = ((i - 1 + step_r) % m + m) % m + 1;
int step_c = (dc * (cur_len % n)) % n;
int nj = ((j - 1 + step_c) % n + n) % n + 1;
int h1 = add(mul(dp[p-1][i][j].fi, pb1[p-1], MOD), dp[p-1][ni][nj].fi, MOD);
int h2 = add(mul(dp[p-1][i][j].se, pb2[p-1], MOD2), dp[p-1][ni][nj].se, MOD2);
dp[p][i][j] = {h1, h2};
}
}
cur_len *= 2;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
int h1 = 0, h2 = 0;
int ci = i, cj = j;
for (int p = LOG - 1; p >= 0; p--) {
if ((k >> p) & 1) {
h1 = add(mul(h1, pb1[p], MOD), dp[p][ci][cj].fi, MOD);
h2 = add(mul(h2, pb2[p], MOD2), dp[p][ci][cj].se, MOD2);
int step = (1LL << p);
int step_r = (dr * (step % m)) % m;
ci = ((ci - 1 + step_r) % m + m) % m + 1;
int step_c = (dc * (step % n)) % n;
cj = ((cj - 1 + step_c) % n + n) % n + 1;
}
}
final_hashes.push_back({h1, h2});
}
}
}
void run_test() {
cin >> m >> n >> k;
// n = S.length();
// m = T.length();
// S = '_' + S;
// T = '_' + T;
// int HashT = 0;
// for( int i = 1; i <= n; i++ ){
// H[i] = (H[i-1] * base + S[i] - 'a' + 1) % MOD;
// }
// for( int i = 1; i <= m; i++ ){
// HashT = (HashT * base + T[i] - 'a' + 1) % MOD;
// }
for(int i = 1; i <= m; i++){
cin >> SS[i];
SS[i] = '_' + SS[i];
}
pb1[0] = base;
pb2[0] = base2;
for (int p = 1; p < LOG; p++) {
pb1[p] = mul(pb1[p-1], pb1[p-1], MOD);
pb2[p] = mul(pb2[p-1], pb2[p-1], MOD2);
}
for(int i = 0; i < 8; i++){
solve_dir(i);
}
sort(all(final_hashes));
int numerator = 0;
int cur_cnt = 0;
for (int i = 0; i < final_hashes.size(); i++) {
cur_cnt++;
if (i == final_hashes.size() - 1 || final_hashes[i] != final_hashes[i+1]) {
numerator += cur_cnt * cur_cnt;
cur_cnt = 0;
}
}
int total_choices = m * n * 8;
int denominator = total_choices * total_choices;
int common = __gcd(numerator, denominator);
cout << numerator / common << "/" << denominator / common << el;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
// freopen("lightsout.in", "r", stdin);
// freopen("lightsout.out", "w", stdout);
int test = 1;
// cin >> test;
while (test-- > 0)
{
run_test();
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |