題目意思:給出a,b,c,k,e,f,g。問多項式(ax+by+cz)k 中 xeyfzg的係數為多少(k=e+f+g)。
思路:根據排列組合的思維,容易想到 xe是從k項中 選e次 即 c(e,k);
而剩下的k-e=f+g項中選yf即從f+g項選f次,即c(f,f+g);而剩下的g項不用再選了只能是z了。
所以答案是 c(e,k)*c(f,f+g)*pow(a,e)*pow(b,f)*pow(c,g)%mod;
寫法有很多種,下面寫了兩種寫法:
寫法一:用陣列cc[ ][ ]存組合數 cc[i][j]的意思就是 c(i,i+j) 。因為cc[i][j](從i+j項選了i個x,j個y)
而cc[i][j]=cc[i-1][j]+cc[i][j-1]
相當於從選了(i-1)項x,j項y,再選一項x, 加上 從選了 i項x,(j-1)項y, 再選一項y,(有點像dp)
#include#include#include
#include
#define inf 0x3f3f3f3f#include
using
namespace
std;
typedef
long
long
ll;const ll mod=10007
;ll cc[
1050][1050
];ll q_pow(ll a,ll b)
return
ans;
}int
main()
寫法二:用fac陣列存階乘。因為c(e,k)=k!/(e!*(k-e)!) 而c(f,f+g)=(f+g)!/(f!*g!)
所以c(e,k)*c(f,f+g)= k!/(e!*f!*g!) (因為k-e=f+g)
直接用逆元處理即可。因為給出的mod是乙個質數,所以用費馬小定理即可,且**簡單。
#include#include#include
#include
#define inf 0x3f3f3f3f#include
using
namespace
std;
typedef
long
long
ll;const ll mod=10007
;ll fac[
1050
];ll q_pow(ll a,ll b)
return
ans;
}int
main()
組合數學 有趣的數列
我們稱乙個長度為 2n 的數列是有趣的,當且僅當該數列滿足以下三個條件 它是從 1 到 2n 共 2n 個整數的乙個排列 所有的奇數項滿足 a 1 n 1a 1a1 n 1 所有的偶數項滿足 a 2 na 2a2 n 任意相鄰的兩項 a2i 1 a a2 i 1 與 a2ia a2i 1 i n 1...
Newcoder 70 D 幸運數字 (組合數學)
description 定義乙個數字為幸運數字當且僅當它的所有數字都是4 44或者777。比如說,47 744 4 47 744 4 47 744 4都是幸運數字而5 17 467 5 17 467 5 17 4 67都不是。現在想知道在1.n1.n 1.n的第k kk小的排列中,有多少個幸運數字所...
數字組合不重複的演算法
用1,2,3,4四個數字,組成沒有重複數字的四位數的個數是 4!也就是24個。其他的比如1,2,3,4,5的組合是5 具體的演算法如下 用遞迴的方法來解答的 int32 num ilistlists num.tolist ilistresults new list for int32 i 0 i n...