Submission #245870

#TimeUsernameProblemLanguageResultExecution timeMemory
245870leakedOsmosmjerka (COCI17_osmosmjerka)C++14
160 / 160
2198 ms72468 KiB
#include<bits/stdc++.h> using namespace std; //#include<ext/pb_ds/assoc_container.hpp> //#include<ext/pb_ds/tree_policy.hpp> // // #pragma GCC optimize("unroll-loops") // #pragma GCC optimize("Ofast") // #pragma GCC optimize("-O3") // #pragma GCC optimize("no-stack-protector") // #pragma GCC optimize("fast-math") //#define LOCAL #define sim template < class c #define ris return * this #define dor > debug & operator << #define eni(x) sim > typename \ enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) { sim > struct rge { c b, e; }; sim > rge<c> range(c i, c j) { return rge<c>{i, j}; } sim > auto dud(c* x) -> decltype(cout<< *x, 0); sim > char dud(...); struct debug { #ifndef LOCAL ~debug() { cout << endl; } eni(!=) cout << boolalpha << i; ris; } eni(==) ris << range(begin(i), end(i)); } sim, class b dor(pair < b, c > d) { ris << "(" << d.first << ", " << d.second << ")"; } sim dor(rge<c> d) { *this << "["; for (auto it = d.b; it != d.e; ++it) *this << ", " + 2 * (it == d.b) << *it; ris << "]"; } #else sim dor(const c&) { ris; } #endif }; #define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] " #define fi first #define f first #define se second #define s second #define vi_a vector<int>a; #define p_b push_back ////////////////////////////////???????????????CHECK THIS OUT???????????????////////////////////////////// #define ll long long ////////////////////////////////???????????????CHECK THIS OUT???????????????////////////////////////////// #define ld long double #define pll pair<ll,ll> #define pii pair<int,int> #define m_p make_pair #define fast_io cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(0); #define all(x) x.begin(),x.end() #define getfiles ifstream cin("input.txt");ofstream cout("output.txt"); #define pw(x) (1ll << x) #define sz(x) (ll)x.size() #define endl "\n" #define rall(x) x.rbegin(),x.rend() #define len(a) (ll)a.size() #define rep(x,l,r) for(ll x=l;x<r;x++) //using namespace __gnu_pbds; ld eps = (ld)1 / 1e6; const ld pi=3.14159265359; ll inf = 1e18,mod1=1e9+7; ll sqr(ll a) { return a * a; } ll qb(ll a) { return a * a * a; } ll gcd(ll a, ll b) { return !a ? b : gcd(b % a, a); } ll binpow(ll a, ll b, ll mod) { return b ? (b % 2 ? (a * (sqr(binpow(a, b / 2, mod)) % mod)) % mod : sqr(binpow(a, b / 2, mod)) % mod) : 1; } ll binmult(ll a, ll b, ll mod) { return b ? (b % 2 ? (2 * binmult(a, b / 2, mod) + a) % mod : (2 * binmult(a, b / 2, mod)) % mod) : 0; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const ll R=1e4; const ll tx[4]={0,0,-1,1}; const ll ty[4]={-1,1,0,0}; const char rev_to[4]={'E','W','N','S'}; const int N=5e2+1; const int M=999999937; const int pp=73; const pii d[8]={{1,1},{1,-1},{-1,1},{-1,0},{1,0},{0,-1},{0,1},{-1,-1}}; ll h[8][N][N],p[8][N][N],st[8][N][N]; char a[N][N]; ll rl[8][N][N]; pii pos[8][N][N]; unordered_map<ll,int>mp; int n,m,k; signed main(){ fast_io; cin>>n>>m>>k; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>a[i][j]; for(int t=0;t<8;t++){ ll cur=1,pr=0,what=1; for(int ps=0;ps<32;ps++){ /// calculating pod'em's for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(!ps){ h[t][i][j]=a[i][j]-'a'+1; } else{ int tf=((pw(ps-1)*d[t].f+i)%n+n)%n,ts=((pw(ps-1)*d[t].s+j)%m+m)%m; // debug()<<imie(i)<<imie(j)<<imie(tf)<<imie(ts); h[t][i][j]=(p[t][i][j]+1ll*p[t][tf][ts]*cur%M)%M; } } } pr=cur; if(!ps){ cur=pp; } else{ cur=(pr*pr)%M; // debug()<<imie(cur)<<imie(binpow(pp,pw(ps),M)); // assert(cur==binpow(pp,pw(ps),M)); } /// calculating hashes if(pw(ps) & k){ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ ll w=(pw(ps)-1)&k; int f=((w*d[t].f+i)%n+n)%n,s=((w*d[t].s+j)%m+m)%m; // debug()<<imie(what)<<imie(binpow(pp,w,M)); // cout.flush(); // assert(what==binpow(pp,w,M)); rl[t][i][j]=(rl[t][i][j]+h[t][f][s]*what%M)%M; } } what=(what*cur)%M; } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ p[t][i][j]=h[t][i][j]; } } } } for(int t=0;t<8;t++){ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ mp[rl[t][i][j]]++; // debug()<<imie(d[t])<<imie(i)<<imie(j)<<imie(rl[t][i][j]); } } } ll f=0,s=8*n*m;s*=s; for(auto &z : mp){ f+=1ll*z.s*z.s; } ll g=__gcd(f,s);f/=g;s/=g; cout<<f<<'/'<<s; return 0; } ///stuff you should look for : /* 9 1 2 2 3 2 5 3 4 1 6 6 7 7 8 7 9 2 1 1 1 1 1 1 1 1 * int overflow, array bounds * special cases (n=1?) * do smth instead of nothing and stay organized * read the conditions carefully * WRITE STUFF DOWN */

Compilation message (stderr)

osmosmjerka.cpp: In function 'int main()':
osmosmjerka.cpp:101:39: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
                         int tf=((pw(ps-1)*d[t].f+i)%n+n)%n,ts=((pw(ps-1)*d[t].s+j)%m+m)%m;
                                     ~~^~
osmosmjerka.cpp:56:23: note: in definition of macro 'pw'
 #define pw(x) (1ll << x)
                       ^
osmosmjerka.cpp:101:70: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
                         int tf=((pw(ps-1)*d[t].f+i)%n+n)%n,ts=((pw(ps-1)*d[t].s+j)%m+m)%m;
                                                                    ~~^~
osmosmjerka.cpp:56:23: note: in definition of macro 'pw'
 #define pw(x) (1ll << x)
                       ^
#Verdict Execution timeMemoryGrader output
Fetching results...