Ant Counting
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 4763 | Accepted: 1816 |
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
题意:有n中蚂蚁,第i种蚂蚁有N_i个,一共有A个蚂蚁。不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别。从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法。(解释不清楚,请看题中的Hint)
<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[1010];
int dp[1010][100010];
int t,n,s,b;
int mod=1e6;
int main()
{
while(~scanf("%d %d %d %d",&t,&n,&s,&b))
{
int x;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
scanf("%d",&x);
a[x-1]++;
}
for(int i=0;i<=t;i++)//一个都不取的方法只有一种
dp[i][0]=1;
for(int i=0;i<t;i++){
for(int j=1;j<=b;j++){
if(j-1-a[i]>=0){
//在取余的情况下,要避免减法运算的结果出现负数
dp[i+1][j]=(dp[i+1][j-1]+dp[i][j]-dp[i][j-1-a[i]]+mod)%mod;
}
else
dp[i+1][j]=(dp[i+1][j-1]+dp[i][j])%mod;
}
}
int ans=0;
for(int i=s;i<=b;i++)
ans=(ans+dp[t][i])%mod;
printf("%d\n",ans);
}
return 0;
}
</span>
4200



被折叠的 条评论
为什么被折叠?



