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 <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
long long fact[100002], inv[100002];
long long pw(long long b, long long e)
{
long long ans = 1;
while(e)
{
if(e & 1)
ans = (ans * b) % MOD;
b = (b * b) % MOD;
e >>= 1;
}
return ans;
}
long long C(long long n, long long k)
{
if(n < k){
return 0;
}
long long ans = fact[n];
ans *= inv[k];
ans %= MOD;
ans *= inv[n-k];
ans %= MOD;
return ans;
}
int main(){
fact[0] = 1;
for(long long i = 1; i <= 100000; i++){
fact[i] = (fact[i-1] * i) % MOD;
}
inv[0] = 1;
for(long long i = 1; i <= 100000; i++){
inv[i] = pw(fact[i], MOD-2);
}
long long n, l;
cin >> n >> l;
long long r[1 + n];
for(long long i = 1; i <= n; i++){
cin >> r[i];
}
sort(r + 1, r + n + 1);
bool allEqual = true;
for(long long i = 1; i < n; i++){
if(r[i] != r[i + 1]){
allEqual = false;
break;
}
}
if(allEqual){
cout << (fact[n] * C(l - (n - 1) * r[1] - 1 + n, n)) % MOD << "\n";
}
else{
vector<vector<vector<long long> > > dp(2, vector<vector<long long> >(5 + n, vector<long long>(5 + l, 0)));
dp[0][0][0] = 1;
long long cur = 0;
for(long long i = 1; i <= n; i++){
cur ^= 1;
dp[cur][0][0] = 0;
long long rad = r[i];
for(long long j = 1; j <= i; j++){
for(long long k = 1; k <= l; k++){
dp[cur][j][k] = dp[!cur][j - 1][k - 1];
if(k >= rad){
dp[cur][j][k] = (dp[cur][j][k] + (dp[!cur][j][k - rad] * 2 * j) % MOD) % MOD;
}
if(k >= 2 * rad - 1){
dp[cur][j][k] = (dp[cur][j][k] + (dp[!cur][j + 1][k - 2 * rad + 1] * j * (j + 1)) % MOD) % MOD;
}
}
}
}
long long ans = 0;
for(long long i = 1; i <= l; i++){
ans = (ans + (dp[cur][1][i] * C(l - i + n, n)) % MOD) % MOD;
}
cout << ans << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |