This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
using namespace std;
#define nl '\n'
#define pb push_back
template<class T> using V = vector<T>;
using vi = V<int>;
const int MOD = 1e9 + 7;
int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	auto add = [&](int &x, int y) {
		x += y; if (x >= MOD) x -= MOD;
	};
	auto mul = [&](int &x, int y) {
		x = (x * 1LL * y) % MOD;
	};
	auto POW = [&](int a, int p) {
		int ans = 1;
		for(; p; p /= 2, mul(a, a)) if (p & 1) mul(ans, a);
		return ans;
	};
	auto INV = [&](int a) {
		return POW(a, MOD - 2);
	};
	int N; cin >> N;
	vi F = {1}, IF = {1}; for(int i = 1; i <= N; i++) {
		F.pb(F.back()); mul(F.back(), i);
		IF.pb(INV(F.back()));
	}
	auto nCk = [&](int n, int k) { 
		int ways = F[n]; 
		mul(ways, IF[n - k]); mul(ways, IF[k]); 
		return ways; 
	};
	V<vi> dp(N + 1, vi(2)), ndp(N + 1, vi(2)); // dp[index][left][happy] = # of ways
	dp[N][0] = 1;
	for(int i = 1; i <= N; i++) {
		for(int x = 0; x <= N; x++) for(int h = 0; h < 2; h++) if (dp[x][h]) {
			for(int g = 0; g <= x; g++) {
				int nx = x - g, nh = h | (g == i);
				int ways = dp[x][h]; mul(ways, nCk(x, g));
				// cout << i << " " << x << " " << h << " => " << nx << " " << nh << " => " << ways << endl;
				add(ndp[nx][nh], ways);
			}
		}
		dp.swap(ndp);
		ndp = V<vi>(N + 1, vi(2));
	} 
	cout << dp[0][1] << nl;
	exit(0-0);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |