第一行两个正整数 n,k表示要收集 n 朵樱花,而前方还有 k 棵樱花树。
接下来一行 k 个正整数 s1,s2,⋯ ,sk,其中 si 表示最多在第 i 棵樱花树下收集到 si 朵樱花。
一行一个整数,表示恰好收集到 n 朵樱花的方案数。
由于答案可能太大,请输出答案对 10086001 取模后的值。
特殊地,如果收集不到 n 朵樱花,请输出一个字符串 impossible。
#include <bits/stdc++.h>
using namespace std;
const int mn=5e3+3,mod=10086001;
int f1[mn],f2[mn];
int a[mn];
int main()
{
int n,m,sum=0;
cin>>n>>m;
for(int i=1;i<=m;++i)
{
scanf("%d",&a[i]);
sum+=a[i];
f2[0]=1;f1[0]=1;
}
if(sum<n)
{
cout<<"impossible";
return 0;
}
f1[0]=1;f2[0]=1;int ans=0;
for(int i=1;i<=m;++i)
{
int s=1;
for(int j=1;j<=n;++j)
{
if(j-a[i]>0)
s=(s-f1[j-a[i]-1])%mod;
while(s<0) s+=mod;
s=(s+f1[j])%mod;
f2[j]=s;
}
ans=(ans+f2[n])%mod;
for(int j=1;j<=n;++j)
f1[j]=f2[j];
}
cout<<ans;
return 0;
}