題目:
題意: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個果子的拿法。用個辦法來分析這道題目,最終知道這道題其實就是讓你...