【名词解释】
第一行输入整数
表示测试用例个数。
对于每个测试用例:
第一行输入两个整数
,满足
且
为奇数;
第二行输入
个整数
。
保证所有测试用例的
之和不超过
。
对每个测试用例输出一行一个整数,表示所有长度为
的子序列中位数之和模
的结果。
1 5 1 1 1 1 1 1
5
所有长度为的子序列的中位数为
,因此答案为
。
逛了一圈发现没有我的做法,就写一个吧,详情可以看我的b站视频****************************************
哎呀呀,这种一眼就能看出是组合数学的题目,居然还要本天才翔子出马?你们这些杂鱼的大脑难道和二进制数组里的 0 一样,完全没有存在的价值吗?呵呵~
既然你们求知欲这么旺盛(其实是太笨了吧?),那我就勉为其难地给你们这群逊毙了的家伙写篇题解。好好盯着看,这可是天才的恩赐!
听好了,笨蛋杂鱼们!这道题的数组只有 0 和 1。
这种 的预处理加 的遍历,连杂鱼都能跑通,要是你还写错,建议直接退出代码界呢~
这种基础的逆元和阶乘预处理,要是杂鱼不会写,翔子真的会笑出声的哦!
#include <bits/stdc++.h>
#define il inline
#define double long double
using namespace std;
using ll = long long;
using ull = unsigned long long;
using int128 = __int128_t;
const ll N = 2e5 + 5, mod = 1e9+7, inf = 2e18;
const double eps = 1e-9;
double PI = 3.1415926;
// 杂鱼才需要写注释,但我还是帮你们写了,感谢我吧!
ll quick_mi(ll a,ll b){
ll ans=1;
while(b){
if(b&1){
ans=ans*a%mod;
}
b>>=1;
a=a*a%mod;
}
return ans;
}
// 逆元都不会算的杂鱼可以去重修小学数学了
ll inv(ll n){
return quick_mi(n,mod-2);
}
vector<ll>fact(N,1),inv_fact(N);
// 组合数公式 C(n, m),杂鱼记住了吗?
ll C(ll n,ll m){
if(m<0||m>n)return 0; // 选不出来就是0,和杂鱼的智商一样
return fact[n]*inv_fact[m]%mod*inv_fact[n-m]%mod;
}
il void solve() {
int n,k;
cin>>n>>k;
vector<ll>a(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
}
// 排序后 1 都在右边,方便我们固定中位数
sort(a.begin()+1,a.end());
ll ans=0;
ll need=k/2;
for(int i=1;i<=n;i++){
// 只有 a[i]=1 才有贡献,杂鱼要是这里写错就逊爆了
(ans+=C(i-1,need)*C(n-i,need)*a[i]%mod)%=mod;
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
// 预处理阶乘,为了拯救杂鱼的时间复杂度
for(int i=1;i<N;i++){
fact[i]=fact[i-1]*i%mod;
}
inv_fact[N-1]=inv(fact[N-1]);
for(int i=N-2;i>=0;i--){
inv_fact[i]=inv_fact[i+1]*(i+1)%mod;
}
cin >> t;
while (t--){
solve();
}
return 0;
}
虽然 Python 慢得像杂鱼爬行,但逻辑还是一样简单的呢。
import sys, math, queue, itertools, heapq
from collections import deque
from array import array
from bisect import bisect_right
# 这个递归深度,杂鱼的大脑能承受吗?
sys.setrecursionlimit(1145141919)
input = sys.stdin.readline
def read():
line = sys.stdin.readline()
if not line:
return []
return list(map(int, line.split()))
mod = 10**9 + 7
N = 2 * (10**5) + 5
def quick_mi(a, b):
ans = 1
while b:
if b & 1:
ans = ans * a % mod
b >>= 1
a = a * a % mod
return ans
def inv(n):
return quick_mi(n, mod - 2)
fact = [1] * N
inv_fact = [0] * N
def C(n, m):
if m < 0 or m > n:
return 0
return fact[n] * inv_fact[m] * inv_fact[n - m] % mod
def solve():
n, k = read()
need = k // 2
a = [0] + read()
# 居然要手动排序,Python 真是麻烦呢,呵呵~
a.sort(key=lambda x: x)
ans = 0
for i in range(1, n + 1):
# 左右两边各选 need 个,中间坐个 1
ans += a[i] * C(i - 1, need) * C(n - i, need)
ans %= mod
print(ans)
def main():
# 预处理是给杂鱼最后的仁慈
for i in range(1, N):
fact[i] = fact[i - 1] * i % mod
inv_fact[N - 1] = inv(fact[N - 1])
for i in range(N - 2, -1, -1):
inv_fact[i] = inv_fact[i + 1] * (i + 1) % mod
line = sys.stdin.readline()
if not line: return
t = int(line)
for _ in range(t):
solve()
if __name__ == "__main__":
main()
看明白了吗?这道题的精髓就是:只要你不是个连组合数都不会算的杂鱼,你就能过!
固定中位数位置,左右两边各选一半,这么简单的逻辑要是还要我讲第二遍,我就要把你的准考证撕掉喽~ 呵呵。赶紧去提交吧,别在这里碍眼了!
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod=1e9+7;
vector<ll> jie(2e5+1);
ll ni(ll n)//求逆元
{
ll ans=1;
ll m=mod-2;
while(m)
{
if(m&1) ans=ans*n%mod;
n=n*n%mod;
m>>=1;
}
return ans;
}
ll C(ll n,ll m)//求C(n,m)
{
return jie[n]*ni(jie[m]*jie[n-m]%mod)%mod;
}
void solve()
{
ll n,k;cin >> n >> k;
ll n0=0,n1=0;
for(ll i=0;i<n;i++)
{
ll num;cin >> num;
if(num) n1++;
else n0++;
}//得到0和1的数量
ll need=k/2+1;//最少需要的1的数量
ll ans=0;//结果
for(ll i=need;i<=min(n1,k);i++)//1的数量从小到最大
{
if(k-i>n0) continue;
ans=(ans+C(n1,i)*C(n0,k-i))%mod;
}
cout << ans <<'\n';
}
int main ()
{
cin.tie(0)->sync_with_stdio(0);
jie[0]=1;
for(ll i=1;i<=2e5;i++)//预处理阶乘
{
jie[i]=jie[i-1]*i%mod;
}
int t;cin >> t;
while(t--) solve();
}
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣤⡀⣀⣠⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡀⢀⣴⣾⣷⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⠛⠉⠉⠉⠉⠉⠉⠛⠻⠿⣿⣿⣿⣿⣿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⡿⠿⠛⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣀⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⣰⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣶⣄⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣻⣿⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢹⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⠁⠈⢢⡀⠀⠀⠀⢸⡇⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⡟⠒⢦⡀⠀⠀⠀
⠀⠀⣠⣤⣤⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡇⠀⠀⠀⠉⢢⣄⠀⠀⢿⠊⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣷⡄⠀⢷⠀⠀⠀
⠀⢰⠇⠀⣰⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⡌⣹⠗⠦⣬⣇⠀⠉⢢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡀⢸⡄⠀⠀
⠀⡟⠀⣼⣯⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣆⢹⡀⠀⠀⠀⠉⠁⠀⠀⢀⣀⡁⠀⠀⠉⠳⢴⡆⠀⠀⠀⠀⠀⠀⢹⣧⠈⡇⠀⠀
⠀⡇⠀⠀⢻⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣾⠻⠉⠛⠂⠀⠀⠀⠀⠀⠀⠻⠿⣿⣿⣿⣶⣦⡀⠛⣇⠀⠀⠀⠀⠀⣈⣿⠀⡇⠀⠀
⢸⡇⠀⠀⢠⣿⣷⣦⣀⡸⣷⣦⣶⡂⠉⠉⠉⢁⣤⣶⡶⠀⠀⠀⣀⣀⡴⠀⠀⠀⠀⠀⠀⠈⠉⠉⠁⠀⡟⢀⣴⣟⣰⣾⣿⣏⣠⠇⠀⠀
⠈⡇⠀⠀⢸⣿⠁⠉⣿⠛⠛⠃⡇⠀⠀⢠⣶⣿⡿⠛⠁⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠼⢿⠟⠿⢿⡏⠀⠘⣿⡀⠀⠀⠀
⠀⢷⣀⣀⣿⠇⠀⠀⢿⡇⠀⢀⢱⡀⠀⠛⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠀⠀⢸⠇⠀⠀⢹⣿⣄⠀⠀
⠀⠀⣉⣿⡏⠀⠀⠀⠀⠀⠀⢸⣇⣳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⣿⠃⠀⠀⠀⠀⠀⠀⣿⠈⢧⠀
⠀⠘⣿⣿⠁⠀⠀⠀⠀⠀⠀⠘⣿⡛⣶⠀⠀⣠⠔⠒⠛⠒⠦⡀⠀⠀⠀⠀⣠⡤⠶⠤⢤⣀⠀⠀⠀⢀⣏⡄⠀⠀⠀⠀⠀⡀⣿⡆⠈⣧
⣠⡾⠛⣿⣿⣧⠀⠀⠀⠀⢸⣿⠾⢿⡿⠀⣰⠃⠀⠀⠀⠀⠀⢹⡄⠀⠀⡼⠁⠀⠀⠀⠀⠈⠙⣦⠀⢸⣿⡇⣾⣣⡀⠀⢰⣿⣿⣿⣤⠾
⡟⠀⠀⠻⣿⡟⢷⡄⣤⡀⠈⣿⡀⣸⠇⠀⠏⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⡇⢀⡀⠀⠀⠀⠀⢀⡟⠀⠀⠋⣿⣿⣿⡇⣠⣿⠿⠛⢷⡀⠀
⠀⠀⠀⠀⣿⣇⣨⣿⣿⣿⣦⣽⣷⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠃⠀⠙⠢⠤⠤⠴⢾⠀⠀⠀⠀⢸⣷⣿⣿⠟⠁⠀⠀⠈⣧⠀
⠀⠀⠀⠀⠈⠉⠉⠁⠈⠉⠈⢉⣿⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⣿⠀
*/