Ant Counting
直接翻译了
Descriptions
贝西有T种蚂蚁共A只,每种蚂蚁有Ni只,同种蚂蚁不能区分,不同种蚂蚁可以区分,记Sum_i为i只蚂蚁构成不同的集合的方案数,问Sum_k(S≤k≤B)之和。Input第一行4个整数T、A、S、B。 接下来A行,每行一个整数,代表这只蚂蚁的种类。Output输出Sum_k(S≤k≤B)之和。 (数据范围见原文)
Sample Input
3 5 2 3 1 2 2 1 3
Sample Output
10
题目链接
https://vjudge.net/problem/POJ-3046
白书69页
参考我学长的博客
https://blog.csdn.net/a1097304791/article/details/90371914
AC代码
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>1
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 100005
using namespace std;
int T,A,S,B;
int dp[1005][Maxn];
int c[Maxn];
int M=1000000;//对M取余
int main()
{
cin>>T>>A>>S>>B;
for(int i=0;i<A;i++)
{
int x;
cin>>x;
c[x]++;
}
for(int i=0;i<=T;i++)
dp[i][0]=1;
for(int i=1;i<=T;i++)
{
for(int j=1;j<=A;j++)
{
if(j-1-c[i]>=0)
dp[i][j]=(dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1-c[i]]+M)%M;
else
dp[i][j]=(dp[i][j-1]+dp[i-1][j]+M)%M;
}
}
int ans=0;
for(int i=S;i<=B;i++)
ans=(ans+dp[T][i]+M)%M;
cout<<ans<<endl;
return 0;
}