Submission #1106783

#TimeUsernameProblemLanguageResultExecution timeMemory
1106783Math4Life2020Fishing Game (RMI19_fishing)C++17
30 / 100
2075 ms9720 KiB
#include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template <class K, class V> using ht = gp_hash_table<K, V, hash<K>, equal_to<K>, direct_mask_range_hashing<>, linear_probe_fn<>, hash_standard_resize_policy<hash_exponential_size_policy<>, hash_load_check_resize_trigger<>, true>>; using ll = long long; using pii = pair<ll,ll>; ll N; const ll p = 1e9+7; const int pc1 = 255; ht<int,ll> dp; inline array<int,3> garr(int x) { return (array<int,3>{x>>16,(x>>8)&pc1,x&pc1}); } inline int gv(array<int,3> a0) { return ((a0[0]<<16LL)+(a0[1]<<8LL)+a0[2]); } ll g1Y(int a, int b, int c) { //Y = round already cleared if ((a<0)||(b<0)||(c<0)) return 0; if ((a+b)==0) { return dp[gv({a,b,c})]; } ll v = 0; //if (b>=0) { v+= b*dp[gv({a,b-1,c})]; //} //if (a>=0) { v+= a*dp[gv({a-1,b,c+1})]; //} return (v%p); } ll g1N(int a, int b, int c) { //N = round not cleared yet if ((a<0)||(b<0)||(c<0)) return 0; return (b*dp[gv({a,b-1,c})])%p; } ll g2Y(int a, int b, int c) { if ((a<0)||(b<0)||(c<0)) return 0; if ((a+c)==0) { return g1Y(a,b,c); } ll v = 0; v += a*g1Y(a-1,b,c); v += c*g1Y(a,b+1,c-1); return (v%p); } ll g2N(int a, int b, int c) { if ((a<0)||(b<0)||(c<0)) return 0; //cout << "calling g2N at a,b,c="<<a<<","<<b<<","<<c<<"\n"; if ((a+c)==0) { return g1N(a,b,c); } ll v = 0; v += a*g1Y(a-1,b,c); v += c*g1N(a,b+1,c-1); return (v%p); } ll gdp(int a, int b, int c) { if ((a<0)||(b<0)||(c<0)) return 0; if ((b+c)==0) { return g2N(a,b,c); } ll v = 0; v += c*g2Y(a,b,c-1); v += b*g2N(a+1,b-1,c); //cout << "gdp at a,b,c="<<a<<","<<b<<","<<c<<"="<<v<<"\n"; return (v%p); } void solve() { dp.clear(); vector<ll> va,vb,vc; int prt[3*N]; for (ll i=0;i<(3*N);i++) { prt[i]=0; } for (int i=0;i<(2*N);i++) { int x; cin >> x; x--; //A prt[x]^=1; } for (int i=0;i<(2*N);i++) { int x; cin >> x; x--; //B prt[x]^=2; } for (int i=0;i<(2*N);i++) { int x; cin >> x; x--; //C prt[x]^=4; } int nea=0,neb=0,nec=0; for (int i=0;i<(3*N);i++) { if (prt[i]==3) { nec++; } if (prt[i]==5) { neb++; } if (prt[i]==6) { nea++; } } ll SM = nea+neb+nec; //cout << "nea,neb,nec="<<nea<<","<<neb<<","<<nec<<"\n"; dp[0]=1; for (int S=1;S<=SM;S++) { for (int a=0;a<=S;a++) { for (int b=0;b<=(S-a);b++) { int c = S-a-b; dp[gv({a,b,c})]=gdp(a,b,c); } } } cout << dp[gv({nea,neb,nec})] <<"\n"; } int main() { dp.resize(1LL<<18); ll T; cin >> N >> T; while(T--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...