Submission #269711

#TimeUsernameProblemLanguageResultExecution timeMemory
269711sebinkimRuins 3 (JOI20_ruins3)C++14
100 / 100
753 ms13688 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const ll mod = 1e9 + 7;

ll C[1212][1212], K[666][1212][2], D[666], B[666];
bool A[1212];
ll n, s;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	ll i, j, l, c0, c1;

	cin >> n;

	for(i = C[0][0] = 1; i <= n; i ++){
		for(j = C[i][0] = 1; j <= n; j ++){
			C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
		}
	}

	K[0][0][0] = 1;
	for(i = 1; i <= n; i ++){
		c0 = c1 = 0;
		for(j = 1; j <= n + n; j ++){
			c0 = (c0 + K[i - 1][j - 1][0]) % mod;
			if(j > i + i) K[i][j][0] = c0 * i % mod;

			c1 = (c1 + K[i - 1][j - 1][1]) % mod;
			if(j >= i + i - 1) K[i][j][1] = (c0 + c1 * (i - 1)) % mod;
		}
		B[i] = (K[i][i + i - 1][1] + K[i][i + i][1]) % mod;
	}

	for(i = 1; i <= n; i ++){
		cin >> j; A[j] = 1;
	}

	D[0] = 1;
	for(i = n + n, c0 = c1 = 0; i >= 1; i --){
		if(A[i] == 1){
			for(j = n; j >= 0; j --){
				for(l = 0; l < j; l ++){
					D[j] = (D[j] + D[l] * C[c1 - l][j - l - 1] % mod
						* B[j - l]) % mod;
				}
			}
			c1 ++;
		}
		else{
			for(j = 0; j <= n; j ++){
				D[j] = D[j] * (j - c0) % mod;
			}
			c0 ++;
		}
	}

	s = D[n];
	for(i = 1; i <= n; i ++){
		s = s * (mod + 1 >> 1) % mod;
	}

	cout << s << "\n";

	return 0;
}

Compilation message (stderr)

ruins3.cpp: In function 'int main()':
ruins3.cpp:65:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   65 |   s = s * (mod + 1 >> 1) % mod;
      |            ~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...