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; }