This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 1205;
const int MOD = 1e9 + 7;
inline int add(int A, int B){
if(A + B >= MOD)
return A + B - MOD;
return A + B;
}
inline int sub(int A, int B){
if(A - B < 0)
return A - B + MOD;
return A - B;
}
inline int mul(int A, int B){
return (ll)A * B % MOD;
}
inline int pot(int A, int B){
int ret = 1, bs = A;
for(; B ; B >>= 1){
if(B & 1) ret = mul(ret, bs);
bs = mul(bs, bs);
}
return ret;
}
int C[N], cat[N], ch[N][N], div2 = (MOD + 1) / 2;
int ubac[N], van[N], A[N], n, dp[N][N], fak[N];
void precompute(){
for(int i = 0;i < N;i++){
ch[i][0] = 1, ch[i][i] = 1;
fak[i] = (i ? mul(fak[i - 1], i) : 1);
}
for(int i = 0;i < N;i++)
for(int j = 1;j < i;j++)
ch[i][j] = add(ch[i - 1][j - 1], ch[i - 1][j]);
for(int i = 0;2 * i < N;i++)
cat[i] = mul(pot(i + 1, MOD - 2), ch[2 * i][i]);
for(int i = 0;2 * i < N;i++){
for(int j = 0;j < i;j++){
if((i - j) % 2 == 1){
int k = (i - j - 1) / 2;
C[i] = add(C[i], mul(k, mul(mul(cat[k], ch[i - 1][j]), mul(fak[i - 1], pot(div2, 2 * k)))));
C[i] = add(C[i], mul(j, mul(mul(cat[k], ch[i - 1][j]), mul(fak[i - 1], pot(div2, 2 * k + 1)))));
C[i] = add(C[i], mul(1, mul(mul(cat[k], ch[i - 1][j]), mul(fak[i - 1], pot(div2, 2 * k)))));
}
}
}
}
int f(int i, int prf){
if(i == 0) return (prf == n);
if(dp[i][prf] != -1) return dp[i][prf];
if(!A[i]){
dp[i][prf] = mul(f(i - 1, prf), prf - van[i + 1]);
return dp[i][prf];
}
else{
int ret = f(i - 1, prf);
for(int prf2 = prf + 1;prf2 <= ubac[i];prf2++){
if(prf2 != n - 1 || ubac[i] != n)
ret = add(ret, mul(f(i - 1, prf2), mul(C[prf2 - prf], ch[ubac[i] - prf - 1][prf2 - prf - 1])));
}
return dp[i][prf] = ret;
}
}
int main(){
memset(dp, -1, sizeof(dp));
scanf("%d", &n); precompute();
for(int i = 0;i < n;i++){
int x; scanf("%d", &x);
A[x] = 1;
}
for(int i = 2 * n;i >= 1;i--){
ubac[i] = ubac[i + 1] + A[i];
van[i] = van[i + 1] + !A[i];
}
printf("%d\n", f(2 * n, 0));
return 0;
}
Compilation message (stderr)
ruins3.cpp: In function 'int main()':
ruins3.cpp:80:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
80 | scanf("%d", &n); precompute();
| ~~~~~^~~~~~~~~~
ruins3.cpp:82:15: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
82 | int x; scanf("%d", &x);
| ~~~~~^~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |