UOJ275 清華集訓2016 組合數問題

2021-08-15 15:40:53 字數 3715 閱讀 1017

組合數 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 2

3 3

output
1
explanation

在所有可能的情況中,只有 c2

1=2' role="presentation" style="position: relative;">c12

=2c2

1=2是

2 2

的倍數。

input

2 5

4 56 7

output
0

7

input
3 23

23333333 23333333

233333333 233333333

2333333333 2333333333

output
851883128

959557926

680723120

對於 20%

' 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定理,把cm

n 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...