# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
107025 | gs14004 | Osmosmjerka (COCI17_osmosmjerka) | C++17 | 1750 ms | 25452 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;
typedef long long lint;
typedef pair<int, int> pi;
const int MAXN = 505;
const int mod1 = 1e9 + 696969;
const int mod2 = 1e9 + 409;
vector<lint> hashes;
int n, m, k;
char str[MAXN][MAXN];
int spt1[2][MAXN][MAXN], spt2[2][MAXN][MAXN];
int hsh0[MAXN][MAXN], hsh1[MAXN][MAXN], nhsh0[MAXN][MAXN], nhsh1[MAXN][MAXN];
lint pwr1[30], pwr2[30];
void Do(int dx, int dy){
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
spt1[0][i][j] = spt2[0][i][j] = str[i][j];
hsh0[i][j] = hsh1[i][j] = 0;
}
}
for(int i=1; i<=30; i++){
if((k >> (i-1)) & 1){
for(int j=0; j<n; j++){
for(int k=0; k<m; k++){
int nxtX = j - (dx<<(i-1));
int nxtY = k - (dy<<(i-1));
nxtX %= n, nxtY %= m;
nxtX += n, nxtY += m;
nxtX %= n, nxtY %= m;
nhsh0[j][k] = (hsh0[nxtX][nxtY] * pwr1[i-1] + spt1[(i-1)%2][j][k]) % mod1;
nhsh1[j][k] = (hsh1[nxtX][nxtY] * pwr2[i-1] + spt2[(i-1)%2][j][k]) % mod2;
}
}
memcpy(hsh0, nhsh0, sizeof(hsh0));
memcpy(hsh1, nhsh1, sizeof(hsh1));
}
for(int j=0; j<n; j++){
for(int k=0; k<m; k++){
int nxtX = j - (dx<<(i-1));
int nxtY = k - (dy<<(i-1));
nxtX %= n, nxtY %= m;
nxtX += n, nxtY += m;
nxtX %= n, nxtY %= m;
spt1[i%2][j][k] = (spt1[(i-1)%2][nxtX][nxtY] * pwr1[i-1] + spt1[(i-1)%2][j][k]) % mod1;
spt2[i%2][j][k] = (spt2[(i-1)%2][nxtX][nxtY] * pwr2[i-1] + spt2[(i-1)%2][j][k]) % mod2;
}
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
lint ans = 1ll * hsh0[i][j] * mod2 + hsh1[i][j];
hashes.push_back(ans);
}
}
}
lint gcd(lint x, lint y){ return y ? gcd(y, x%y) : x; }
int main(){
scanf("%d %d %d",&n,&m,&k);
for(int i=0; i<n; i++) scanf("%s", str[i]);
pwr1[0] = pwr2[0] = 257;
for(int i=1; i<30; i++){
pwr1[i] = 1ll * pwr1[i-1] * pwr1[i-1] % mod1;
pwr2[i] = 1ll * pwr2[i-1] * pwr2[i-1] % mod2;
}
lint Y = 64ll * n * m * n * m;
for(int i=-1; i<=1; i++){
for(int j=-1; j<=1; j++){
if(i || j) Do(i, j);
}
}
lint X = 0;
sort(hashes.begin(), hashes.end());
for(int i=0; i<hashes.size(); ){
int e = i;
while(e < hashes.size() && hashes[e] == hashes[i]) e++;
X += 1ll * (e - i) * (e - i);
i = e;
}
lint g = gcd(X, Y);
X /= g, Y /= g;
printf("%lld/%lld\n", X, Y);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |