MIXUP2 - Đàn bò hỗn loạn
Tác giả: happyboy99x
Ngôn ngữ: C++
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define TR(v,i) for(typeof((v).begin())i=(v).begin();i!=(v).end();++i)
#define N 16
int a[N], n, k;
long long f[1<<N][N];
vector<int> suit[N];
void enter() {
scanf("%d%d",&n,&k);
for(int i = 0; i < n; ++i) scanf("%d", a+i);
}
long long F(int state, int x) {
long long & res = f[state][x];
if(res != -1) return res;
if(state == 0) return res = 1;
res = 0;
TR(suit[x], it) {
int t = *it;
if(state & 1 << t) res += F(state & ~(1 << t), t);
}
return res;
}
void solve() {
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
if(abs(a[i] - a[j]) > k) suit[i].push_back(j);
memset(f, -1, sizeof f);
long long res = 0;
for(int i = 0; i < n; ++i)
res += F((1 << n) - 1 & ~(1 << i), i);
printf("%lld\n", res);
}
int main() {
enter();
solve();
return 0;
}