自己YY了一个DP发现是 O(nm) 的,感觉不太对于是无耻地看了题解,还真是 O(nm) 的DP,而且最后跑得还很快,坑爹的数据范围…
前缀和优化居然想了一下下(证明本人沙茶无误)...
AC code:
#include <cstdio>
const int N=1010;
const int M=100010;
const int TOMOD=1000000;
int n,m,s,b,ans;
int a[N],f[M],g[M],S[M];
int main(){
scanf("%d%d%d%d",&n,&m,&s,&b);
for(int i=1;i<=m;i++){
int tmp;
scanf("%d",&tmp);
a[tmp]++;
}
g[0]=1;
for(int i=1;i<=n;i++){
S[0]=g[0];
for(int j=1;j<=m;j++) S[j]=(S[j-1]+g[j])%TOMOD;
for(int j=0;j<=m;j++){
f[j]=S[j];
if(j-a[i]-1>=0) f[j]=(f[j]-S[j-a[i]-1])%TOMOD;
}
for(int j=0;j<=m;j++) g[j]=f[j];
}
for(int i=s;i<=b;i++) ans=(ans+f[i])%TOMOD;
printf("%d\n",(ans+TOMOD)%TOMOD);
return 0;
}