Submission #868919

#TimeUsernameProblemLanguageResultExecution timeMemory
868919Cyber_WolfMagneti (COCI21_magneti)C++17
110 / 110
279 ms199848 KiB
#include <bits/stdc++.h>

using namespace std;

#define lg long long 

const lg N = 2e5+5, MOD = 1e9+7;

lg v[N], fact[N];

lg fast_power(lg n, lg k)
{
	lg ans = 1;
	while(k)
	{
		if((k&1))
		{
			ans = (ans*n)%MOD;
		}
		n = (n*n)%MOD;
		k >>= 1;
	}
	return ans;
}

lg C(lg n, lg r)
{
	lg ans = fact[n];
	ans = (ans*fast_power(fact[r], MOD-2))%MOD;
	ans = (ans*fast_power(fact[n-r], MOD-2))%MOD;
	return ans;
}

lg dp[51][51][int(1e4+5)], fr[int(1e4+5)];

int main()
{
	lg n, l;
	cin >> n >> l;
	fact[0] = 1;
	for(lg i = 1; i <= 1e5; i++)	fact[i] = (fact[i-1]*i)%MOD;
	for(int i = 1; i <= n; i++)	cin >> v[i];
	sort(v+1, v+n+1);
	dp[1][1][1] = 1;
	for(int i = 1; i < n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			for(int k = 0; k <= l; k++)
			{
				if(k+v[i+1] <= 1e4)	dp[i+1][j][k+v[i+1]] = (dp[i+1][j][k+v[i+1]]+(dp[i][j][k]*j*2ll)%MOD)%MOD;
				if(j && k+v[i+1]*2 <= 1e4)	
				{
					dp[i+1][j-1][k+v[i+1]*2] = (dp[i+1][j-1][k+v[i+1]*2]+(dp[i][j][k]*(j*(j-1))%MOD)%MOD)%MOD;
				}
				dp[i+1][j+1][k] = (dp[i+1][j+1][k]+dp[i][j][k])%MOD; 
			}
		}
	}
	for(int i = 0; i <= l; i++)	fr[i] = dp[n][1][i];
	lg ans = 0;
	for(lg i = 0; i <= l; i++)
	{
		lg cur = fr[i];
		// cout << cur << ' ' << l-i+n << ' ' << n << '\n';
		cur = (cur*C(l-i+n, n))%MOD;
		ans = (ans+cur)%MOD;
	}
	cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...