HDOJ 3037 組合數(lucass定理)

2021-08-15 06:06:12 字數 905 閱讀 4354

題目:

題意:n棵樹上放最多m東西(東西都一樣),問有多少種方法。答案模p。

轉換為:在n個數相加不大於m的方法有多少種。

我們假設,n個數相加剛好等於m。插板法可以得出c(n+m-1,m);

那麼不大於m的就是c(n+i-1,i)。0<=i<=m;

得出結果為c(n+m,m);

所以該題答案應該為c(n+m,m)%p;

因為要組合數又要取模,所以我們運用lucass定理。lucass定理就是用來計算c(n,m)%p這樣的情況。p在1e5都範圍內適用。在傳統求組合的演算法中,運用公式求解會無法處理大資料,因為模運算除法不適用。所以就要用逆元來將除法變乘法。也就是lucass定理。

#include

#define pi 3.1415926

#define inf 1e18

#define inf 1e9

#define min(a,b) a#define max(a,b) a>b?a:b

using

namespace

std ;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int _max = 100000+100;

ll my_pow(ll x,int n,int p)

return ret;

}ll c(ll n,ll m,ll p)

return (a*my_pow(b,p-2,p))%p;//利用逆元求c(n,m)%p;

} ll lucass(ll n,ll m,ll p)

int main()

HDU 3037 隔板法 組合數 Lucas

題意 求在n棵樹上摘不超過m顆豆子的方案數,結果對p取膜。思路 其實就相當於把i 0 i m 個球放入n個不同的盒子裡,盒子可以為空。很明顯,需要用到隔板法。所以對於i個球,方案數為c i n 1,n 1 總方案數為c n 1,n 1 c n,n 1 c n m 1,n 1 然後根據公式c n,m ...

hdu 3037(lucas定理求大組合數取模)

下面簡單介紹一下lucas定理 lucas定理是用來求 c n,m mod p的值,p是素數 從n取m組合,模上p 描述為 a b是非負整數,p是質數。ab寫成p進製 a a n a n 1 a 0 b b n b n 1 b 0 則組合數c a,b 與c a n b n c a n 1 b n 1...

HDU3037 Lucas定理求大組合數取模

題意 給你三個數,n,m,p,n是樹的個數,m是最多拿的果子,p是最後求的數取模p,問有幾種拿果子的方法。這樣一看這個題就是乙個找規律的題,其實可以把這個題合併起來,樹的個數是n,可以把最多拿的果子看作樹,然後每個樹上拿乙個果子,問這m個果子的拿法。用個辦法來分析這道題目,最終知道這道題其實就是讓你...