對糖果和藥片都排一遍序,設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 的最後乙個...