使用遞推式cab
=ca−
1b+c
a−1b
−1
c_a^b=c_^b+c_^
cab=c
a−1b
+ca
−1b−
1求解階乘%1e9+7
t =1
05
t=10^5
t=1051≤b
≤a
≤2000
1\leq b\leq a\leq 2000
1≤b≤a≤
2000
#
include
using
namespace std;
int c[
2010][
2010];
const
int mod=
1e9+7;
void
init()
intmain()
}
t=1
05
t=10^5
t=1051≤b
≤a≤1
05
1\leq b\leq a\leq 10^5
1≤b≤a≤
105階乘%1e9+7
使用公式cab
=a!(
a−b)
!⋅b!
c_a^b=\frac
cab=(
a−b)
!⋅b!
a!預處理階乘,使用快速冪預處理階乘的逆元
#
include
using
namespace std;
#define
lllong
long
int fact[
100010
],infact[
100010];
//fact 階乘,infact 逆元的階乘
const
int mod =
1e9+7;
intqmi
(int a,
int k,
int p)
return res;
}int
main()
int t;cin>> t;
while
(t--
)return0;
}
求cab
modp
c_a^b \mod p
cabmo
dpt =20
t=20
t=20
1 ≤b
≤a≤1
018,1
≤p≤1
05且p
為質
數1\leq b\leq a\leq 10^,1\leq p \leq 10^5且p為質數
1≤b≤a≤
1018
,1≤p
≤105
且p為質
數 盧卡斯定理(lucas)
c ab
≡cam
odpb
modp
+ca/
pb/p
modp
c_a^b\equiv c_^+c_^ \mod p
cab≡c
amod
pbmo
dp+
ca/p
b/p
modp
#
include
#include
using
namespace std;
typedef
long
long ll;
intqmi
(int a,
int k,
int p)
return res;
}intc(
int a,
int b,
int p)
return res;
}int
lucas
(ll a, ll b,
int p)
intmain()
return0;
}
高精度組合數
#
include
using
namespace std;
const
int n =
5010
;int primes[n]
, cnt;
int sum[n]
;bool st[n]
;void
get_primes
(int n)}}
intget
(int n,
int p)
return res;
}vector<
int>
mul(vector<
int> a,
int b)
while
(t)return c;
}int
main()
vector<
int> res;
res.
push_back(1
);for(
int i =
0; i < cnt; i ++
)for
(int j =
0; j < sum[i]
; j ++
) res =
mul(res, primes[i]);
for(
int i = res.
size()
-1; i >=
0; i --
)printf
("%d"
, res[i]);
puts(""
);return0;
}
組合數取模(盧卡斯定理)
組合數取模 盧卡斯定理 模板 const int n 1e5 5 const int mod 10007 ll fac n 用於求取階乘取模 ll n void init ll quick pow ll a,ll b return ans ll c ll n,ll m ll lucas ll n,l...
盧卡斯 Lucas 定理 逆元 求組合數
參考文章 lucas定理是用來求 c n,m mod p,p為素數的值。lucas定理 我們令n sp q m tp r.q r p 那麼 在程式設計時你只要繼續對 呼叫lucas定理即可。可以遞迴的去完成這個過程,其中遞迴終點為t 0 時間o logp n p ll lucas ll a,ll b...
演算法題 盧卡斯定理求組合數(Python)
給定n組詢問,每組詢問給定三個整數a,b,p,其中pp是質數,請你輸出cba mod p的值。輸入格式 第一行包含整數n。接下來n行,每行包含一組a,b,p。輸出格式 共n行,每行輸出乙個詢問的解。資料範圍 1 n 20 1 b a 10 18 1 p 10 5 輸入樣例 3 5 3 7 3 1 5...