P6394 樱花,还有你

第一行两个正整数 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;
}
posted @ 2020-11-11 18:09  停不下来的奥尔加  阅读(83)  评论(0编辑  收藏  举报