Submission #851868

#TimeUsernameProblemLanguageResultExecution timeMemory
851868vjudge1Magneti (COCI21_magneti)C++17
30 / 110
1054 ms600 KiB
//author:
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

#define ONLINE_JUDGE

const int MOD = 1e9 + 7;
const int MAXN = 1e4 + 5;

int fak[MAXN];

int fp(int a, int b) {
    int res = 1;
    while(b) {
        if(b & 1) {
            res = (1LL * res * a) % MOD;
        }

        a = (1LL * a * a) % MOD;
        b >>= 1;
    }

    return res;
}

int divide(int a) {
    return fp(a, MOD -2);
}

int divide(int a, int b) {
    return (1LL * a * divide(b)) % MOD;
}

int comb(int n, int r) {
    if(n < r) 
        return 0;

    return divide(fak[n], (1LL * fak[r] * fak[n - r]) % MOD);
}

int cnts[MAXN];

void solve() {
    int n, l;
    cin >> n >> l;

    vector <int> vec(n);
    for(int &i : vec) 
        cin >> i;

    sort(vec.begin(), vec.end());
        
    int res = 0;
    do {
        int parca = l;
        for(int i = 0; i +1 < n; i++) {
            parca -= max(vec[i], vec[i +1]) -1;
        }

        res = (0LL + res + comb(parca, n)) % MOD;

    } while(next_permutation(vec.begin(), vec.end()));

    for(int &i : vec)
        cnts[i]++;

    for(int i = 1; i < MAXN; i++) {
        res = (1LL * res * fak[cnts[i]]) % MOD;
    }

    cout << res;
    
    return;
}

signed main() {
    #ifndef ONLINE_JUDGE
        freopen(".in", "r", stdin);
        freopen(".out", "w", stdout);
    #endif

    fak[0] = 1;
    for(int i = 1; i < MAXN; i++)
        fak[i] = (1LL * fak[i -1] * i) % MOD;

    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int t = 1; //cin >> t;
    while(t--)
        solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...