組合數 cm
n cnm
表示的是從
n n
個物品中選出
m' role="presentation" style="position: relative;">m
m個物品的方案數。舉個例子,從 (1
,2,3
) (1,
2,3)
三個物品中選擇兩個物品可以有 (1
,2),
(1,3
),(2
,3) (1,
2),(
1,3)
,(2,
3)
這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 cm
n cnm
的一般公式: c
mn=n
!m!(
n−m)
! cnm
=n!m
!(n−
m)
!其中 n!
=1×2
×⋯×n
n !=
1×2×
⋯×
n。(額外的,當 n=
0 n=0
時, n!
=1n !=
1)
小蔥想知道如果給定 n,
m n,m
和 k k
,對於所有的 0≤
i≤n,
0≤j≤
min(i,
m)' role="presentation" style="position: relative;">0≤i
≤n,0
≤j≤min(i
,m)0
≤i≤n
,0≤j
≤min(i
,m)有多少對 (i
,j) (i,
j)
滿足 cj
i cij
是 k k
的倍數。
答案對 109
+7' role="presentation" style="position: relative;">109+
7109+
7取模。
第一行有兩個整數 t,
k t,k
,其中
t t
代表該測試點總共有多少組測試資料。
接下來
t' role="presentation" style="position: relative;">t
t行每行兩個整數 n,
m n,m
。t t
行,每行乙個整數代表所有的 0≤
i≤n,
0≤j≤
min(i,
m)' role="presentation" style="position: relative;">0≤i
≤n,0
≤j≤min(i
,m)0
≤i≤n
,0≤j
≤min(i
,m)中有多少對 (i
,j) (i,
j)
滿足 cj
i cij
是 k k
的倍數。
input
1 2output3 3
1explanation
在所有可能的情況中,只有 c2
1=2' role="presentation" style="position: relative;">c12
=2c2
1=2是
2 2
的倍數。
input
2 5output4 56 7
0input7
3 23output23333333 23333333
233333333 233333333
2333333333 2333333333
851883128對於 20%959557926
680723120
' role="presentation" style="position: relative;">20%20
%的測試點,1≤
n,m≤
100 1≤n
,m
≤100
;對於另外 15%15%
的測試點,n≤
m n≤m
;對於另外 15%15%
的測試點, k=
2 k=2
;對於另外 15%15%
的測試點, m≤
10 m≤10
;對於 100
% 100
%的測試點, 1≤
n,m≤
1018,1
≤t,k
≤100
1 ≤n
,m≤10
18,1≤
t,k≤
100,且
k k
是乙個質數。
時間限制:1s
' role="presentation" style="position: relative;">1s1
s 空間限制:
512mb
512mb
這道題可以根據lucas定理,把cmn cnm
是k的倍數轉化為n,m為k進製數,某一位的組合數也是k的倍數也就是n,m在k進製下有一位比k小,之後通過數字dp轉化一下就行了。
#pragma gcc optimize(3)
#include
using
namespace
std;
typedef
long
long ll;
bool finish_read;
template
inline
void read(t &x)while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;finish_read=1;}
template
inline
void print(t x)
template
inline
void writeln(t x)
template
inline
void write(t x)
/****************=header template**********====*/
const ll mod=1e9+7,inv2=(mod+1)>>1;
int t,n,m;
ll f[70][2][2],a[70],b[70],k,x,y;
inline ll calc(ll x,ll y)
int main()
read(y);
y=min(y,x);
tmp=y;
while(tmp)
ll ans=calc(x,y);
f[0][1][1]=1;
for(int i=1;i<=n;i++)
printf("%lld\n",(ans-f[n][1][1]+mod)%mod);
while(n)
a[n--]=0;
while(m)
b[m--]=0;
}}
UOJ 275 清華集訓2016 組合數問題
試題描述 組合數 c n m 表示的是從 n 個物品中選出 m 個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 c n m 的一般公式 begin c n m frac notag end 其中...
UOJ 275 清華集訓2016 組合數問題
組合數 c n m 表示的是從 n 個物品中選出 m 個物品的方案數。舉個例子,從 1,2,3 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 c m n 的一般公式 c n m frac 其中 n 1 2 n 額外的,當 ...
UOJ 275 最短路徑問題
題目描述 平面上有n個點,每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之間的最短路徑。輸入描述 輸入檔案共n m 3行,其中 第一行為整數n。第2行到第n 1...