Submission #1258918

#TimeUsernameProblemLanguageResultExecution timeMemory
1258918g4yuhgSkyscraper (JOI16_skyscraper)C++20
15 / 100
586 ms194732 KiB
//Huyduocdithitp
#include <bits/stdc++.h>
#define int long long
typedef long long ll;
#define pii pair<ll, ll> 
#define fi first
#define se second
#define TASK "mansion"
#define start if(fopen(TASK".in","r")){freopen(TASK".in","r",stdin);freopen(TASK".out","w",stdout);}
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);
#define N 400005
#define endl '\n'
using namespace std;

bool ghuy4g;

const ll mod = 1e9 + 7;

ll getbit(ll mask, ll i) {
	return (mask >> i) & 1;
}

ll onbit(ll mask, ll i) {
	return mask | (1 << i);
}

void add(ll &u, ll v) {
	u += v;
	if (u >= mod) u -= mod;
}

ll f[15][(1 << 14)][101], n, L, a[101];

ll dp(ll i, ll mask, ll j) {
	if (__builtin_popcount(mask) == n) {
		return 1;
	}
	if (f[i][mask][j] != -1) return f[i][mask][j];
	ll res = 0;
	if (__builtin_popcount(mask) == 0) {
		for (int u = 1; u <= n; u ++) {
			add(res, dp(u, onbit(mask, u - 1), j));
		}
		f[i][mask][j] = res;
		return res;
	}
	for (int u = 1; u <= n; u ++) {
		if (getbit(mask, u - 1)) continue;
		if (j - abs(a[u] - a[i]) >= 0) {
			add(res, dp(u, onbit(mask, u - 1), j - abs(a[u] - a[i])));
		}
	}
	f[i][mask][j] = res;
	return res;
}

bool klinh;

signed main() {
    faster;
    
    memset(f, -1, sizeof(f));
    
    cin >> n >> L;
    for (int i = 1; i <= n; i ++) {
    	cin >> a[i];
    }
    
    cout << dp(0, 0, L);
 	    
 	cerr << fabs(&klinh - &ghuy4g) / 1048576.0;
 	cerr << endl << 1.0 * clock() / CLOCKS_PER_SEC << endl;
 	    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...