Matrix
Description
Data Constraint
Solution
对
A
序列排序,然后考虑差分。
设
设当前元素的的差值为
val
,则
val
=
Ai
-
Ai−1
原来的差值和为
k
,则新的差值和
接下来考虑四种转移
1、新增加的元素作为新的一组的开始元素。
fi,j+1,v +=
fi−1,j,k
2、新的元素同时作为新的一组的开始元素和结束元素。
fi,j,v += fi−1,j,k
3、新的元素作为未结束的j组中的一组的结束元素。
fi,j−1,v
+=
fi−1,j,k
*
j
(j >
0
)
4、新的元素作为未结束的j组中的一组的未结束元素。
fi,j,v +=
fi−1,j,k
*
j
(j >
0
)
最后统计答案。
Ans =
∑ki=0
fn,0,i
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,j,l) for(int i=j;i<=l;i++)
#define fd(i,j,l) for(int i=j;i>=l;i--)
using namespace std;
typedef long long ll;
const ll N=12e2,M=250,mo=1e9+7;
ll f[2][M][N],a[N],b[N];
int n,m,j,k,l,i,o,p;
int main()
{
cin>>n>>k;
fo(i,1,n)scanf("%d",&a[i]);
sort(a+1,a+n+1);
int u=0,v;
a[0]=0;
fo(i,1,n)b[i]=a[i]-a[i-1];
b[0]=0;
f[0][0][0]=1;
fo(l,1,n){
v=1-u;
fo(i,0,l)
fo(j,0,k)f[v][i][j]=0;
fo(i,0,l-1)
fo(j,0,k-i*b[l])
if(f[u][i][j])
{
ll op=f[u][i][j]%mo,vv=j+i*b[l];
f[v][i+1][vv]+=op;
f[v][i][vv]+=op;
if(i)f[v][i-1][vv]+=op*i;
if(i)f[v][i][vv]+=op*i;
}
u=v;
}
ll ans=0;
fo(i,0,k)ans=(ans+f[v][0][i])%mo;
printf("%lld",ans);
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,j,l) for(int i=j;i<=l;i++)
#define fd(i,j,l) for(int i=j;i>=l;i--)
using namespace std;
typedef long long ll;
const ll N=12e2,M=250,mo=1e9+7;
ll f[2][M][N],a[N],b[N];
int n,m,j,k,l,i,o,p;
int main()
{
cin>>n>>k;
fo(i,1,n)scanf("%d",&a[i]);
sort(a+1,a+n+1);
int u=0,v;
a[0]=0;
fo(i,1,n)b[i]=a[i]-a[i-1];
b[0]=0;
f[0][0][0]=1;
fo(l,1,n){
v=1-u;
fo(i,0,l)
fo(j,0,k)f[v][i][j]=0;
fo(i,0,l-1)
fo(j,0,k-i*b[l])
if(f[u][i][j])
{
ll op=f[u][i][j]%mo,vv=j+i*b[l];
f[v][i+1][vv]+=op;
f[v][i][vv]+=op;
if(i)f[v][i-1][vv]+=op*i;
if(i)f[v][i][vv]+=op*i;
}
u=v;
}
ll ans=0;
fo(i,0,k)ans=(ans+f[v][0][i])%mo;
printf("%lld",ans);
}