用的线段树在 n×n×k 算f[i][j]被谁加上,样例都过不了。
#include<bits/stdc++.h>
#define mod 10086001
#define Maxn 5005
using namespace std;
int a[Maxn],f[Maxn][Maxn];
struct Tree {
int val[Maxn<<2],lazy[Maxn<<2];
void merge(int x,int l,int r,int L,int R,int value) {
if(L<=l&&r<=R) {
lazy[x]=(lazy[x]+value)%mod;
val[x]=(val[x]+value*(r-l+1)%mod)%mod;
return ;
} int mid=l+r>>1;
lazy[x<<1]=(lazy[x<<1]+lazy[x])%mod;
val[x<<1]=(val[x<<1]+lazy[x]*(mid-l+1)%mod)%mod;
lazy[x<<1|1]=(lazy[x<<1|1]+lazy[x])%mod;
val[x<<1|1]=(val[x<<1|1]+lazy[x]*(r-mid)%mod)%mod;
lazy[x]=0;
if(L<=mid)merge(x<<1,l,mid,L,R,value);
if(mid<R)merge(x<<1|1,mid+1,r,L,R,value);
val[x]=val[x<<1]+val[x<<1|1];
}
int query(int x,int l,int r,int u) {
if(l == r)return val[x];
int mid=l+r>>1,ans=0;
lazy[x<<1]=(lazy[x<<1]+lazy[x])%mod;
val[x<<1]=(val[x<<1]+lazy[x]*(mid-l+1)%mod)%mod;
lazy[x<<1|1]=(lazy[x<<1|1]+lazy[x])%mod;
val[x<<1|1]=(val[x<<1|1]+lazy[x]*(r-mid)%mod)%mod;
lazy[x]=0;
if(u<=mid)ans=query(x<<1,l,mid,u);
else ans=query(x<<1|1,mid+1,r,u);
val[x]=val[x<<1]+val[x<<1|1];
return ans;
}
void Memset() {
memset(val,0,sizeof(val));
memset(lazy,0,sizeof(lazy));
}
} tre[2];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,k0;
cin>>k0>>n;
f[0][0]=1;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++) {
tre[!(i&1)].Memset();
for(int j=0;j<=k0;j++) {
f[i][j]=tre[(i&1)].query(1,0,k0,j);
tre[!(i&1)].merge(1,0,k0,j,min(j+a[i+1],n),f[i][j]);
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans=(ans+f[i][k0])%10086001;
if(!ans)cout<<"impossible";
else cout<<ans;
return 0;
}