小红拿到了一个数组,她准备选择一个子序列,使得该子序列的中位数尽可能大。小红想知道,一共有多少种方案? 奇数长度的子序列中位数为中间的那个数,偶数长度的子序列中位数为中间两个数的平均数。
区块链毕设网qklbishe.com为您提供问题的解答
小红拿到了一个数组,她准备选择一个子序列,使得该子序列的中位数尽可能大。小红想知道,一共有多少种方案?
奇数长度的子序列中位数为中间的那个数,偶数长度的子序列中位数为中间两个数的平均数。
/* 选的最大值个数比其他数至少多一个即可 */ #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5 + 10, mod = 1e9 + 7; int n, maxx; unordered_map<int,int> mp; ll fact[N], infact[N], L[N]; ll ksm(ll x, ll y) { ll res = 1; while( y ) { if(y & 1) res = res * x % mod; x = x * x % mod; y >>= 1; } return res; } void init() { fact[0] = infact[0] = 1; for(int i=1; i<=n; i++) { fact[i] = fact[i - 1] * i % mod; infact[i] = infact[i - 1] * ksm(i, mod - 2) % mod; } } ll C(int n, int m) { return ((fact[n] * infact[m] % mod) * infact[n - m]) % mod; } int main() { ios :: sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> n; init(); for(int i=1; i<=n; i++) { int t; cin >> t; maxx = max(maxx, t); mp[t] ++; } int right = mp[maxx], left = n - right; L[0] = 1; for(int i=1; i<=left; i++) { L[i] = (L[i - 1] + C(left, i)) % mod; } ll res = 0; for(int i=1; i<=right; i++) { (res += C(right, i) * L[i - 1]) %= mod; } cout << res; return 0; }
31:48
以上就是关于问题小红拿到了一个数组,她准备选择一个子序列,使得该子序列的中位数尽可能大。小红想知道,一共有多少种方案?
奇数长度的子序列中位数为中间的那个数,偶数长度的子序列中位数为中间两个数的平均数。的答案
欢迎关注区块链毕设网-
web3一级市场套利打新赚钱空投教程
区块链NFT链游项目方科学家脚本开发培训