description
假設某個店鋪有n
nn種不同型別的1
11元奧利奧和m
mm種不同型別的2
22元奧利奧,而且餘量無限,我的錢有k
kk元,我想把k
kk元都用來買奧利奧,且可以買同型別的奧利奧,你能幫我算出有多少種購買方式嗎?設答案為z
zz,這個數字也許會很大,所以我們只需要輸出zmo
dp
z\ mod\ p
zmod
p的值。
input
輸入的第一行包含乙個整數t
tt,表示測試組數。
每個測試用例前面都有乙個空白行。
每個測試用例由包含整數n,m
,k
n,m,k
n,m,
k和素數p
pp的單行組成。
( t=
100,3≤
p≤10
6,0≤
n,m≤
1000,1
≤k
≤1000
)(t=100,3\le p\le 10^6,0\le n,m\le 1000,1\le k\le 1000)
(t=100
,3≤p
≤106
,0≤n
,m≤1
000,
1≤k≤
1000
) output
對於每個測試用例輸出乙個整數:表示不同的購買奧利奧的方式的數量zmo
dp
z\ mod\ p
zmod
p的值。
sample input
0 10 2 47
2 2 4 47
5 5 10 47
sample output10
146solutionn=0
n=0n=
0時只有k
kk為偶數時可以用完所有錢買k
2\frac
2k個2
22元的
m =0
m=0m=
0時只能買k
kk個1
11元的
n ,m
>
0n,m>0
n,m>
0時,列舉買的2
22元的個數i
ii,那麼需要買k−2
ik-2i
k−2i
個1
11元的
剩餘問題是有n
nn種物品,每種物品無限,買x
xx個的方案數,由插板法顯然得知答案為cx+
n−1n
−1
c_^cx
+n−1
n−1
注意p
pp可能比較小,通過預處理階乘及其逆元求組合數會出問題,直接預處理組合數即可
code
#includeusing namespace std;
typedef long long ll;
int t,n,m,k,p;
int mul(int x,int y)
int add(int x,int y)
int pow(int x,int y)
return z;
}int c[2005][2005];
void init(int n=2000)
}int main()
else if(m==0)ans=c[k+n-1][n-1];
else
}printf("%d\n",ans);
} return 0;
}
Newcoder 128 F 填數字(貪心)
description 托公尺發現了一種新的遊戲 填數字 每填寫一次數字 1 i 9 1 le i le 9 1 i 9 需要花費a ia i ai 枚金幣,托公尺總共有n nn枚金幣.托公尺想知道他能得到的最大數字是多少.如果填不了請輸出 1 1 1。不需要用完所有金幣 input 第一行乙個數字...
Newcoder 128 B 麻婆豆腐(概率)
description 我手上有n nn枚硬幣,第i ii枚正面朝上的概率是p ip i pi 我現在每個硬幣各拋一次,正面朝上看做1 11,背面朝上看做0 00,把所有硬幣得到的數異或起來決定最後得到的數。問 有多少個子集合使得0 00和1 11的概率相等?input 輸入的第一行包含乙個整數t ...
Newcoder 128 C 尋寶(樹形DP)
description 由依是戰線佯攻部隊的輔助人員,在岩澤消失之後,企圖代替岩澤成為gdm gdmgd m主唱。但是sss sssss s戰線的領袖仲村由理是不會輕易讓她加入的,於是由理子給了由依一項艱鉅的任務 去乙個地下迷宮尋找寶石 這個迷宮由n nn個房間組成,編號為0 00到n 1 n 1n...