답안 #1106782

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1106782 2024-10-31T04:27:33 Z Math4Life2020 Fishing Game (RMI19_fishing) C++17
50 / 100
2000 ms 100996 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>;
ll N;

const ll p = 1e9+7;
const int pc1 = 255;
map<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() {
	ll T; 
	cin >> N >> T;
	while(T--) {
		solve();
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 6 ms 644 KB Output is correct
4 Correct 47 ms 3040 KB Output is correct
5 Correct 1896 ms 38372 KB Output is correct
6 Execution timed out 2065 ms 26440 KB Time limit exceeded
7 Execution timed out 2068 ms 38324 KB Time limit exceeded
8 Execution timed out 2043 ms 58088 KB Time limit exceeded
9 Execution timed out 2066 ms 78792 KB Time limit exceeded
10 Execution timed out 2061 ms 100996 KB Time limit exceeded