BZOJ 3622 已經沒有什麼好害怕的了

2021-09-01 23:17:04 字數 2276 閱讀 9015

對糖果和藥片都排一遍序,設cnt

[i

]cnt[i]

cnt[i]

表示對於i

ii號糖果,比他小的藥片有多少個,f[i

][j]

f[i][j]

f[i][j

]表示對於前i

ii個糖果和對應的i

ii個藥片,糖果比藥片至少多j

jj個的方案數是多少,不考慮其他的情況,dp轉移f[i

][j]

f[i][j]

f[i][j

]。f [i

][j]

=f[i

−1][

j]+f

[i−1

][j−

1]×(

cnt[

i]−j

+1

)f[i][j]=f[i-1][j]+f[i-1][j-1]\times (cnt[i]-j+1)

f[i][j

]=f[

i−1]

[j]+

f[i−

1][j

−1]×

(cnt

[i]−

j+1)

最後容斥求出糖果比藥片恰好多k

kk個的方案數

a ns

=∑i=

kn(−

1)i−

k(ik

)f[n

][i]

(n−i

)!

ans=\sum_^n (-1)^ \binom f[n][i] (n-i)!

ans=i=

k∑n​

(−1)

i−k(

ki​)

f[n]

[i](

n−i)

!

#include

#include

intread()

ch=getchar()

;}while

((ch>=

'0')

&&(ch<=

'9')

)return x*f;

}const

int maxn=

2000

;const

int mod=

1000000009

;int n,k,candy[maxn+10]

,pill[maxn+10]

,cnt[maxn+10]

,f[maxn+10]

[maxn+10]

,fac[maxn+10]

,ifac[maxn+10]

;intc(

int a,

int b)

return

1ll*fac[a]

*ifac[b]

%mod*ifac[a-b]

%mod;

}int

main()

k=((n-k)

>>1)

+k;for

(int i=

1; i<=n;

++i)

for(

int i=

1; i<=n;

++i)

fac[0]

=1;for

(int i=

1; i<=n;

++i)

ifac[0]

=ifac[1]

=1;for

(int i=

2; i<=n;

++i)

for(

int i=

1; i<=n;

++i)

std::

sort

(candy+

1,candy+n+1)

; std::

sort

(pill+

1,pill+n+1)

;int now=0;

for(

int i=

1; i<=n;

++i)

cnt[i]

=now;

} f[0]

[0]=

1;for(

int i=

1; i<=n;

++i)}}

int ans=0;

for(

int i=k; i<=n;

++i)

printf

("%d\n"

,ans)

;return0;

}

bzoj 3622 已經沒有什麼好害怕的了

我好害怕這種題 兩個陣列排序後,處理出next i 表示滿足tang i yao j 的最大的j。f i j 前i種糖果,有j個糖比藥多,不考慮剩餘情況的方案數 也就是剩餘n j個糖果的放法算一種,最後乘上階乘。f i j f i 1 j f i 1 j 1 max next i j 1,0 開始忘...

BZOJ 3622 已經沒有什麼好害怕的了

這名字起的。題意 給出兩數列a,b都有n個元素,元素兩兩互不相同,問有多少種方案使得恰好 a i b j 的數目 a i b j 的數目 k?轉化 恰好有a i b j 的數目 n k 2 如果n k為奇數無解。link here 蒟蒻連普通dp也想不到啊otz 首先將糖果藥片們排序 設糖果i大於的...

BZOJ3622 已經沒有什麼好害怕的了

題意 給定兩個長度為n的互不相同的序列,將其兩兩配對,求有多少種配對使得a i b i 的對數減去其他對數恰好為k。一道經典的計數題,但思路理清後發現並不算難。首先設x為a i 小於b i 的對數。x x k n 2 x n k 所以當n k為奇數,答案為0。先令ne i 表示小於a i 的最後乙個...