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;
#define ar array
#define int long long
const int mod = 1e9 + 7;
const int N = 105;
int dp[N][N][N * 10][3];
int a[N];
signed main(){
ios::sync_with_stdio(0); cin.tie(0);
int n, l; cin>>n>>l;
for(int i=0;i<n;i++) cin>>a[i];
sort(a, a+n);
a[n] = N * 10;
if(n == 1){
cout<<1<<"\n";
return 0;
}
dp[1][1][(a[1] - a[0]) * 2][0] = 1;
dp[1][1][a[1] - a[0]][1] = 2;
for(int i=1;i<n;i++){
int dif = a[i+1] - a[i];
for(int j=1;j<=n;j++){
for(int c=0;c<=l;c++){
for(int z=0;z<3;z++){
if(!dp[i][j][c][z]) continue;
if(z < 2 && c + dif * (2 * j - z - 1) <= l){
if(i == n - 1){
dp[i + 1][j][c + dif * (2 * j - z - 1)][z + 1] =
(dp[i + 1][j][c + dif * (2 * j - z - 1)][z + 1] + dp[i][j][c][z] * (2 - z)) % mod;
} else if((z == 1 && j > 1) || z == 0){
dp[i + 1][j][c + dif * (2 * j - z - 1)][z + 1] =
(dp[i + 1][j][c + dif * (2 * j - z - 1)][z + 1] + dp[i][j][c][z] * (j - z) * (2 - z)) % mod;
}
if(c + dif * (2 * j - z + 1) <= l){
dp[i + 1][j + 1][c + dif * (2 * j - z + 1)][z + 1] =
(dp[i + 1][j + 1][c + dif * (2 * j - z + 1)][z + 1] + dp[i][j][c][z] * (2 - z)) % mod;
}
}
// make new component
if(c + dif * (2 * j - z + 2) <= l){
dp[i + 1][j + 1][c + dif * (2 * j - z + 2)][z] =
(dp[i + 1][j + 1][c + dif * (2 * j - z + 2)][z] + dp[i][j][c][z]) % mod;
}
// add to some component
if(c + dif * (2 * j - z) <= l){
dp[i + 1][j][c + dif * (2 * j - z)][z] =
(dp[i + 1][j][c + dif * (2 * j - z)][z] + dp[i][j][c][z] * (2 * j - z)) % mod;
}
if(c + dif * (2 * j - z - 2) <= l && j >= 2 && (z < 2 || i == n - 1 || j > 2)){
if(z == 0){
dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] =
(dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] + dp[i][j][c][z] * j * (j - 1)) % mod;
}
if(z == 1){
dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] =
(dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] + dp[i][j][c][z] * (j - 1) * (j - 1)) % mod;
}
if(z == 2){
dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] =
(dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] + dp[i][j][c][z] * max(1ll, (j - 2) * (j - 1))) % mod;
}
}
}
}
}
}
int res = 0;
for(int i=0;i<=l;i++){
res = (res + dp[n][1][i][2]) % mod;
}
cout<<res<<"\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... |