Submission #1186129

#TimeUsernameProblemLanguageResultExecution timeMemory
1186129dostsMagneti (COCI21_magneti)C++17
110 / 110
167 ms208748 KiB
#include <bits/stdc++.h> #define int long long #define pii pair<int,int> #define vi vector<int> #define ff first #define ss second #define all(x) x.begin(),x.end() #define sp << " " << using namespace std; const int N = 3e5+10,MOD = 1e9+7,inf = 2e12; int add(int x,int y) { if (x+y >= MOD) return x+y-MOD; return x+y; } int mult(int x,int y) { return (x*y)%MOD; } int expo(int x,int y) { if (!y) return 1; int e = expo(x,y >> 1); e = mult(e,e); if (y&1) e = mult(e,x); return e; } int divide(int x,int y) { return mult(x,expo(y,MOD-2)); } int f[N],finv[N]; int nck(int n,int k) { return mult(f[n],mult(finv[k],finv[n-k])); } void combo() { f[0] = 1; for (int i = 1;i<N;i++) f[i] = mult(f[i-1],i); finv[N-1] = divide(1,f[N-1]); for (int i = N-2;i>=0;i--) finv[i] = mult(finv[i+1],i+1); assert(nck(5,3) == 10); return; } void solve() { combo(); int n,l; cin >> n >> l; int dp[n+1][n+1][l+1]{}; vi r(n+1); for (int i=1;i<=n;i++) cin >> r[i]; sort(r.begin()+1,r.end()); dp[1][1][1] = 1; for (int i = 1;i<n;i++) { for (int j = 1;j<=i;j++) { for (int c = 1;c <= l;c++) { if (j < n && c < l) dp[i+1][j+1][c+1] = add(dp[i+1][j+1][c+1],dp[i][j][c]); if (c+r[i+1] <= l) dp[i+1][j][c+r[i+1]] = add(dp[i+1][j][c+r[i+1]],mult(dp[i][j][c],2*j)); if (c+2*r[i+1]-1 <= l) dp[i+1][j-1][c+2*r[i+1]-1] = add(dp[i+1][j-1][c+2*r[i+1]-1],mult(dp[i][j][c],j*(j-1))); } } } int ans = 0; for (int c = 1;c <= l;c++) ans = add(ans,mult(dp[n][1][c],nck(l-c+n,n))); cout << ans << '\n'; } signed main() { ios_base::sync_with_stdio(0);cin.tie(0); #ifdef Dodi freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int t = 1; //cin >> t; while (t --> 0) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...