Submission #1251880

#TimeUsernameProblemLanguageResultExecution timeMemory
1251880vneduSkyscraper (JOI16_skyscraper)C++20
100 / 100
250 ms321860 KiB
#include<bits/stdc++.h>
using namespace std;
#define TASK ""

const int N = 100 + 5;
const int L = 1000 + 5;
const int mod = 1e9 + 7;
int n,l,a[N];
long long dp[N][N][1<<2][L];
void solve()
{
    cin>>n>>l;
    if(n==1) return void(cout<<1);
    for(int i=1;i<=n;++i)
    {
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    dp[0][0][0][0]=1;
    for(int i=0;i<=n;++i)
    {
        for(int j=0;j<=n;++j)
        {
            for(int b=0;b<(1<<2);++b)
            {
                for(int k=0;k<=l;++k)
                {
                    long long &cur=dp[i][j][b][k];
                    cur%=mod;
                    if(i<n && cur)
                    {
//                        cout<<i<<' '<<j<<' '<<b<<' '<<k<<"   "<<cur<<'\n';
                        int cnt=2*j-__builtin_popcount(b);
                        int diff=a[i+1]-a[i];
                        int kdot=k+cnt*diff;
                        if(kdot<=l)
                        {
                            // gop 2p
                            if(j>=2) dp[i+1][j-1][b][kdot]+=cur*1LL*(j-1)%mod;
                            // chen 1p
                            if(j)
                            {
                                dp[i+1][j][b][kdot]+=cur*1LL*cnt%mod;
                                if(!(b>>0&1)) dp[i+1][j][b|(1<<0)][kdot]+=cur;
                                if(!(b>>1&1)) dp[i+1][j][b|(1<<1)][kdot]+=cur;
                            }
                            // tao 1p
                            dp[i+1][j+1][b][kdot]+=cur*1LL*(j+1-__builtin_popcount(b))%mod;
                            if(!(b>>0&1)) dp[i+1][j+1][b|(1<<0)][kdot]+=cur;
                            if(!(b>>1&1)) dp[i+1][j+1][b|(1<<1)][kdot]+=cur;
                        }
                    }
                }
            }
        }
    }
    long long ans=0;
    for(int k=0;k<=l;++k) ans+=dp[n][1][(1<<2)-1][k];
    cout<<(ans%=mod);
}
int main(void)
{
//    freopen(TASK".inp","r",stdin);
//    freopen(TASK".out","w",stdout);
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int testcase=1;
//    cin>>testcase;
    while(testcase--)
        solve();
//    cerr << "Time elapsed: " << (1.0 * clock() / CLOCKS_PER_SEC) << " s.\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...