#include <bits/stdc++.h>
using namespace std;
int const MOD=1e9+7;
int dp[105][105][3][1005];
int delta[105];
int n,sum;
void read(){
cin>>n>>sum;
int i;
for(i=1;i<=n;++i)
cin>>delta[i];
sort(delta+1,delta+n+1);
for(i=n;i;--i)
delta[i]-=delta[i-1];
}
void add(int& x,int val){
x=(x+val)%MOD;
}
int get_dp(){
if(n==1)
dp[1][1][2][0]=1;
if(n>=2)
dp[1][1][1][0]=2;
if(n>=3)
dp[1][1][0][0]=1;
int i,j,s,cap;
for(i=2;i<=n;++i)
for(j=1;j<=i;++j)
for(s=0;s<=sum;++s)
for(cap=0;cap<3;++cap){
if(s-delta[i]*(2*j-2-cap)>=0 && j-cap>=0 && 2*j-2-cap>=0)
add(dp[i][j][cap][s],1LL*(j-cap)*dp[i-1][j-1][cap][s-delta[i]*(2*j-2-cap)]%MOD);
if(s-delta[i]*(2*j-cap)>=0)
add(dp[i][j][cap][s],1LL*(2*j-cap)*dp[i-1][j][cap][s-delta[i]*(2*j-cap)]%MOD);
if(s-delta[i]*(2*j+2-cap)>=0)
add(dp[i][j][cap][s],1LL*j*dp[i-1][j+1][cap][s-delta[i]*(2*j+2-cap)]%MOD);
if(cap && s-delta[i]*(2*j-cap+1)>=0)
add(dp[i][j][cap][s],1LL*(3-cap)*dp[i-1][j][cap-1][s-delta[i]*(2*j-cap+1)]%MOD);
if(cap && s-delta[i]*(2*j-1-cap)>=0 && 2*j-1-cap>=0)
add(dp[i][j][cap][s],1LL*(3-cap)*dp[i-1][j-1][cap-1][s-delta[i]*(2*j-1-cap)]%MOD);
}
int ans=0;
for(i=0;i<=sum;++i)
add(ans,dp[n][1][2][i]);
return ans;
}
int main()
{
read();
cout<<get_dp();
return 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... |