給定nn'>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
'>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問題特點:資料組數較多,a,b範圍較大,且要求對乙個定值取模。解決方法:乘法逆元利用乘法逆元將a/b mod p轉化成a*b-1 mod p。'>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
然後將階乘與階乘的逆元分別打表即可。
遞推式:
① 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 #includeusing
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問題特點:資料組數較少,a,b範圍很大,p的值非定值。解決方法:lucas定理'>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
若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取值不大,但沒有要求取模。解決方法:高精度題目沒有要求取模,就沒辦法在過程中保證資料的大小,只能暴力高精度。'>a,b
,求的值。注意結果可能很大,需要使用高精度計算。
1≤b≤a≤5000
根據組合數的定義,可得:
在迴圈過程中一邊乘一邊除即可,這樣便只需要寫兩個函式:高精度乘低精度,高精度除以低精度。
**實現:
#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 ...