多重集組合數
阿新 • • 發佈:2019-01-27
/* 有n種物品,第i種物品有ai個,不同類的物品可以互相區分但相同種類的無法區分,從這些物品中取出m個話,有多少種取法?,求取出方案模 M 的餘數。 1<=n<=1000 1<=m<=1000 1<=ai<=1000 1<=M<=1000 演算法時間複雜度:O(nm); */ # include <stdio.h> # include <iostream> using namespace std; # define MAX_N 1000+5 int n,m; int a[MAX_N]; int M; int dp[MAX_N+1][MAX_N+1]; void solve() { for(int i=0;i<=n;i++) dp[i][0]=1; for(int i=0;i<n;i++) for(int j=1;j<=m;j++) if(j-i-a[i]>=0) dp[i+1][j]=(dp[i+1][j-1]+dp[i][j]-dp[i][j-1-a[i]]+M)%M; else dp[i+1][j]=(dp[i+1][j-1]+dp[i][j])%M; printf("%d\n",dp[n][m]); } int main() { while(cin>>n>>m) { for(int i=0;i<n;i++) cin>>a[i]; cin>>M; solve(); } return 0; }