【POJ

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;
}
原文地址:https://www.cnblogs.com/sky-stars/p/11341756.html