題意:
sol:
第一眼看起來就是個稍微麻煩的組合數
但是發現如果欽點哪些同學分數在某科目上分數比b神低以後的方案,就會出現沒有被欽
點碾壓的同學也會被碾壓,(後面欽點分數時可能欽點的一直是同一批人導致人數不夠不被碾壓的人數)
於是可以考慮容斥,用至少i
ii個人的方案算出恰好k
kk個人的方案。
可以得到
因為被碾壓的不能超過b君最大的乙個排名,所以定義up=
mi
nup=min\
up=min∑i
=kup
(−1)
i−k(
ik)(
n−1i
)∏j=
1m(n
−i−1
rj−1
)∑x=
1uj(
uj−x
)rj−
1xn−
rj
\sum_^(-1)^\binom\binom\prod_^m\binom\sum_^(u_j-x)^x^
i=k∑up
(−1
)i−k
(ki
)(in
−1)
j=1∏
m(r
j−1
n−i−
1)x
=1∑u
j(
uj−
x)rj
−1x
n−rj
發現後邊列舉分數的∑
\sum
∑實際上是在對關於u
ju_j
uj的多項式做字首和,因此是個n
nn次多項式,拉格朗日插值即可,因為x是自己取,所以可以做線性插值,複雜度n
2n^2
n2
#include
#include
#include
const
int n =
1e2+9;
typedef
long
long ll;
const
int upmax =
1e2+5;
#define p 1000000007
#define debug printf("gg\n")
inline
intmin
(int a,
int b)
inline ll fst
(ll b, ll k)
return ans;
}int n, m, k, rk[n]
; ll u[n]
;ll lagr
(ll *ax, ll *ay,
int up, ll x)
res =
(res +
(ll)
(s1 *
fst(s2, p -2)
)% p * ay[i]
% p)
% p;
}return res;
} ll tx[n]
, ty[n]
, poly[n]
; ll inv[n]
, fac[n]
;inline ll c
(int n,
int m)
int up;
void
init()
poly[i]
=lagr
(tx, ty, n +
1, u[i]);
} up = n;
for(
int i =
1; i <= m; i++
) up =
min(up, n - rk[i]);
}void
solve()
printf (
"%lld\n"
,(ans % p + p)
% p);}
void
debugr()
res = res2 * res % p *
c(n -
1- i, n - rk[j]
- i)
% p;
} ans =
(ans + res)
% p;
}printf
("%lld\n"
,(ans % p + p)
% p);}
intmain()
BZOJ 4559 成績比較
題意 sol 第一眼看起來就是個稍微麻煩的組合數 但是發現如果欽點哪些同學分數在某科目上分數比b神低以後的方案,就會出現沒有被欽 點碾壓的同學也會被碾壓,後面欽點分數時可能欽點的一直是同一批人導致人數不夠不被碾壓的人數 於是可以考慮容斥,用至少 i 個人的方案算出恰好 k 個人的方案。可以得到 因為...
bzoj4559 JLOI2016 成績比較
time limit 20 secmemory limit 256 mbg系共有n位同學,m門必修課。這n位同學的編號為0到n 1的整數,其中b神的編號為0號。這m門必修課編號為0到m 1的整數。一位同學在必修課上可以獲得的分數是1到ui中的乙個整數。如果在每門課上a獲得的成績均小於等於b獲得的成績...
JLOI2016 成績比較
給定 n 個變數,每個變數有 m 個屬性,屬性 i 的值在 1,u i 中隨機。第 1 個變數的所有屬性的排名以及給出,然後我們知道恰好有 k 個變數滿足所有屬性都嚴格小於等於 1 求所有可能的合法情況。答案對 10 9 7 取模。n,m le 100,u i le 10 9 方便起見,令 n le...