HDU 2110-Crisis of HDU(母函數),hdu2110-crisis
Crisis of HDUTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3606 Accepted Submission(s): 1015
Problem Description話說上回講到HDU大戰東洋小苟,結果自然是中方大勝,這一戰也使得海東集團在全球同行業中的地位更加鞏固。隨著集團的發展,很多創業時期的元老逐步功成身退,先是8600移民海外,然後是linle夫婦退隱山林,逐漸的,最初眾多的元老只剩下XHD夫婦和Wiskey三人了。
到了2020年,因為擴張過度加上老鼠數量逐年減少,公司的發展遇到了前所未有的危機,此時集團已經沒有任何流動資金,更可怕的是,這個時候,wiskey也決定退出了!
退出本身並不麻煩,麻煩的是,退出的人需要取走相應比例(1/3)金額的資產。
假設公司此時一共有n種價值的資產,每種價值的資產數量已知,請協助心煩意亂的XHD夫婦計算一共有多少種分割資產的方法。
Input輸入包含多個測試執行個體,每個執行個體的第一行是一個整數n(n<100),表示一共有n種價值的資產,接著的n行每行包含兩個整數pi和mi(0<pi,mi<10),分別表示某種價值和對應的數量,n為0的時候結束輸入。
Output對於每個測試執行個體,請輸出分割資產的方案數%10000,如果不能分割,請輸出“sorry”,每個執行個體的輸出佔一行。
Sample Input
21 12 10
Sample Output
1注意分步取餘就好了。。雖然我不認為組合數可以超int。。#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <string>#include <cctype>#include <vector>#include <cstdio>#include <cmath>#include <deque>#include <stack>#include <map>#include <set>#define ll long long#define maxn 110#define pp pair<int,int>#define INF 0x3f3f3f3f#define max(x,y) ( ((x) > (y)) ? (x) : (y) )#define min(x,y) ( ((x) > (y)) ? (y) : (x) )using namespace std;int n,v[maxn],a[16666],b[16666],num[maxn],p;void solve(){memset(a,0,sizeof(a));a[0]=1;for(int i=0;i<n;i++){for(int j=0;j<=num[i]&&j*v[i]<=p;j++)for(int k=0;k+j*v[i]<=p;k++)b[k+j*v[i]]+=a[k];for(int j=0;j<=p;j++){a[j]=b[j]%10000;b[j]=0;}}if(a[p])printf("%d\n",a[p]%10000);elseputs("sorry");}int main(){ while(~scanf("%d",&n)&&n){p=0;for(int i=0;i<n;i++){scanf("%d%d",&v[i],&num[i]);p+=v[i]*num[i];}if(p%3){puts("sorry");continue;}p/=3;solve();}return 0;}