POJ -3046 Ant Counting
阿新 • • 發佈:2018-11-19
題目:這個題的意思是說給你t種螞蟻a只,然後要求你在其中選出s,s+1,.....b 只共有多少種方法。結果只需要輸出最後6位即可。
題解:多重集組合數問題。dp[i][j]就是前i種螞蟻取j只的方法數。num[i]就是第i種螞蟻的個數。其實就是多重集組合數裸題。
當j>=num[i]時,dp[i][j]=(dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1-num[i]]+mod)%mod;
當j<num[i]時,dp[i][j]=(dp[i][j-1]+dp[i-1][j])%mod;
AC程式碼:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> using namespace std; #define io ios::sync_with_stdio(0),cin.tie(0) #define ms(arr) memset(arr,0,sizeof(arr)) #define inf 0x3f3f3f typedef long long ll; const int mod=1000000; const int maxn=1e5+7; int t,a,s,b; int num[maxn]; int dp[1000][maxn]; int main() { cin>>t>>a>>s>>b; ms(num); for(int i=1;i<=a;i++) { int n; cin>>n; num[n]++; } 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-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 ans=0; for(int i=s;i<=b;i++) ans=(ans+dp[t][i])%mod; cout<<ans<<endl; return 0; }