Time Limit: 1000MS | Memory Limit: 65536KB | 64bit IO Format: %lld & %llu |
Description
Being a bit mathematical, Bessie started wondering. Bessie noted that the hive has T (1 <= T <= 1,000) families of ants which she labeled 1..T (A ants altogether). Each family had some number Ni (1 <= Ni <= 100) of ants.
How many groups of sizes S, S+1, ..., B (1 <= S <= B <= A) can be formed?
While observing one group, the set of three ant families was seen as {1, 1, 2, 2, 3}, though rarely in that order. The possible sets of marching ants were:
3 sets with 1 ant: {1} {2} {3}
5 sets with 2 ants: {1,1} {1,2} {1,3} {2,2} {2,3}
5 sets with 3 ants: {1,1,2} {1,1,3} {1,2,2} {1,2,3} {2,2,3}
3 sets with 4 ants: {1,2,2,3} {1,1,2,2} {1,1,2,3}
1 set with 5 ants: {1,1,2,2,3}
Your job is to count the number of possible sets of ants given the data above.
Input
* Lines 2..A+1: Each line contains a single integer that is an ant type present in the hive
Output
Sample Input
3 5 2 3 1 2 2 1 3
Sample Output
10
Hint
Three types of ants (1..3); 5 ants altogether. How many sets of size 2 or size 3 can be made?
OUTPUT DETAILS:
5 sets of ants with two members; 5 more sets of ants with three members
多重集组合数模板
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 10010;
int v[N], num[N], dp[1000][N];
const int mod = 1000000;
int main()
{
int t, a, s, b;
while(scanf("%d %d %d %d",&t, &a, &s, &b)!=EOF)
{
memset(num, 0,sizeof(num));
for(int i=0;i<a;i++)
{
int x;
scanf("%d", &x);
num[x]++;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<=t;i++)
{
dp[i][0]=1;
}
for(int i=1;i<=t;i++)
{
for(int j=1;j<=b;j++)
{
if(j-1-num[i]>=0)
{
dp[i][j]=(dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1-num[i]]+mod)%mod;
}
else
{
dp[i][j]=(dp[i][j-1]+dp[i-1][j])%mod;
}
}
}
int sum=0;
for(int i=s;i<=b;i++)
{
sum=(sum+dp[t][i])%mod;
}
printf("%d\n",sum);
}
return 0;
}