状压dp
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
const int M=1<<17;
const int S=20;
lli f[S][M];
int n,m,a[S];
signed main()
{
cin>>n>>m;
for (int i=1;i<=n;i++) cin>>a[i];
int mks=(1<<n)-1;
for (int i=1;i<=n;i++) f[i][1<<(i-1)]=1;
for (int i=0;i<=mks+1;i++)
for (int k=1;k<=n;k++)
if (i&(1<<(k-1)))
for (int j=1;j<=n;j++)
if (!(i&(1<<(j-1)))&&(a[k]-a[j]>m||a[j]-a[k]>m))
f[j][i|(1<<(j-1))]+=f[k][i];
lli ans=0;
for (int i=1;i<=n;i++) ans+=f[i][mks];
cout<<ans;
return 0;
}