F 有趣的數字(組合數 逆元)

2022-08-15 05:03:19 字數 1294 閱讀 8890

題目意思:給出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...