組合數學 組合數問題(四類彙總)

2022-03-29 22:09:10 字數 3954 閱讀 5962

給定n

'>n

組詢問,每組詢問給定兩個整數a,b

'>a,b

,請你輸出

n'>a,b

'>n

'>a,b

'>cab

mod(109

+7)'>的值。

n'>a,b

'>cab

mod(109

+7)'>1≤n

≤10000

'>1≤n≤10000,1

≤b≤a

≤2000

'>1≤b≤a≤2000

n

'>a,b

'>cab

mod(109

+7)'>1≤n

≤10000

'>1≤b

≤a≤2000

n

'>a,b

'>cab

mod(109

+7)'>1≤n

≤10000

'>1≤b

≤a≤2000

'>問題特點:資料組數較多,a,b的範圍較小,且要求對乙個定值取模。

解決方法:楊輝三角

因為a,b範圍非常小,直接利用楊輝三角打表即可。

**實現:

#include #include 

#include

using

namespace

std;

const

int n = 2010, mod = 1e9+7

;int

s[n][n];

void

start()

intmain()

return0;

}

給定n

'>n組詢問,每組詢問給定兩個整數a,b

'>a,b,請你輸出ca

b mo

d (10

9+7)

'>的值。

n'>a,b

'>cab

mod(109

+7)'>1≤n

≤10000

'>

1≤n≤10000,1≤

b≤a≤

105'>1≤b≤a≤105

問題特點:資料組數較多,a,b範圍較大,且要求對乙個定值取模。解決方法:乘法逆元利用乘法逆元將a/b mod p轉化成a*b-1 mod p。

然後將階乘與階乘的逆元分別打表即可。

遞推式:

① n! = (n-1)! * n

② n!-1 = (n-1)!-1 * np-2

②的證明:

(n-1)!-1 = (n-1)!p-2

(n-1)!p-2 * np-2 = n!p-2

**實現:

#include #include 

using

namespace

std;

typedef

long

long

ll;const

int n = 100000+10, mod = 1e9 + 7

;int

jc[n],ny[n];

int qmi(int a,int k,int

p)

return

res;

}void

start()

}int

main()

return0;

}

給定n

'>n組詢問,每組詢問給定三個整數a,b

,p'>a,b,p

,其中p

'>p是質數,請你輸出的值n

'>a,b

,p'>p

'>1≤n

≤20'>1≤n≤20,1

≤b≤a

≤1018'>1≤b≤a≤1018,1

≤p≤10

5'>1≤p≤105

問題特點:資料組數較少,a,b範圍很大,p的值非定值。解決方法:lucas定理

若p是質數,則對於任意整數1≤m≤n,有:

相當於是把n和m表示成p進製數,對p進製下的每一位分別計算組合數,最後再乘起來。

利用lucas定理將目標組合數遞迴分解,直到m和n小於p為止。

然後對於每個分解出來的m和n的範圍均在p以內的組合數,就可以放心地根據組合數的定義直接求解。

當然,對於每一步計算過程,都需要對p取模,遇到除法的利用快速冪轉化成乘法逆元即可。

**實現:

#include #include 

#include

#include

using

namespace

std;

typedef

long

long

ll;int p; //

用的次數比較多的變數,一般設定的變數名比較短,且一般設成全域性變數

int qmi(int a,int

k) a=(ll)a * a %p;

k>>=1

; }

return

res;

}int c(int a,int

b)

return

res;

}int

lucas(ll a,ll b)

}int

main()

return0;

}

輸入a,b

'>a,b

,求的值。注意結果可能很大,需要使用高精度計算。

1≤b≤a≤5000

問題特點:只有一組資料,a,b取值不大,但沒有要求取模。解決方法:高精度題目沒有要求取模,就沒辦法在過程中保證資料的大小,只能暴力高精度。

根據組合數的定義,可得:

在迴圈過程中一邊乘一邊除即可,這樣便只需要寫兩個函式:高精度乘低精度,高精度除以低精度。

**實現:

#include #include 

#include

#include

using

namespace

std;

struct

largeint;

largeint lar_mult(largeint a,

intb)

if(a.num[a.len+1]>0)a.len++;

while(a.num[a.len]>9

)

while(a.num[a.len]==0&&a.len>1)a.len--;

returna;}

largeint lar_div(largeint a,

intb)

while(a.num[a.len]==0&&a.len>1)a.len--;

returna;}

void

print(largeint n)

intmain()

print(res);

return0;

}

數學 組合數學

mod must be a prime const int mod 1e9 7 namespace combinatory ll inv ll x ll fac maxn invfac maxn void initc int n ll a ll n,ll m ll c ll n,ll m ll d ...

組合數學 組合設計泛談

組合數學 組合設計泛談 與旋轉矩陣相關的數字問題 從寇克曼女生問題講起 旋轉矩陣涉及到的是一種組合設計 覆蓋設計。而覆蓋設計,填裝設計,斯坦納系,t一設計都是離散數學中的組合優化問題。它們解決的是如何組合集合中的元素以達到某種特定的要求。為了使讀者更容易明白這些問題,下面先從一道相當古老的數學名題講...

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...