专栏文章
[NOIP2025] 清仓甩卖 / sale
P14636题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mimxb5ix
- 此快照首次捕获于
- 2025/12/01 17:04 3 个月前
- 此快照最后确认于
- 2025/12/01 17:04 3 个月前
考虑算不合法的情况。显然是买了 的 ,然后存在一个没有买的 的 ,然后满足 。
考虑对这个计数,首先对 升序排序,然后枚举 (钦定 )和 。显然要满足以下几个条件:
- ,这样才有替换后更优的可能。
- ,此时 的性价比比 高,会优先选 。
因此要满足 。
考虑分讨:
-
对于 ,此时无论 为啥, 的性价比均高于 ,这样的 有 个, 时花费 , 时花费 。
-
对于 ,当 时性价比更高,反之更低,因此当 时花费 ,而 时选不到,因此花费 。
-
对于 ,若此时 , 一定大于 ,显然无解。因此只可能 ,性价比更低,选不到,因此花费 。
以上情况在贡献全部加完后会剩余 的钱数(若更多就可以加入 了,),减去 的花费,因此总共花费 的钱数。只有前两种情况有贡献,分别为花费 和 ,考虑减掉前面的和。第一种情况有 个,第二种情况有 个,总共 个。最终就是求有 个数 ,求总和为 的方案数,这个用组合数很好求,就是 $\dbinom {n-i-1}{m-n+k-2}。(千万别写反了)
剩下的情况,就是找到最大满足 的 ,此时 的位置只能 ,因为若有 就会使其合法。而前 位如何选都可以,因此方案数为 。
因此方案数为 。
AC Code
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5005 , M = 10005 , mod = 998244353;
int cid , T;
int n , m;
int a[N] , fr[M] , inv[M] , pw[M];
int power (int x , int y)
{
int mul = 1;
while (y)
{
if (y & 1) mul = mul * x % mod;
x = x * x % mod;
y >>= 1;
}
return mul;
}
int C (int x , int y)
{
if (x < y) return 0;
return fr[x] * inv[y] % mod * inv[x - y] % mod;
}
void Add (int &x , int y)
{
x += y;
if (x >= mod) x -= mod;
}
signed main ()
{
fr[0] = inv[0] = pw[0] = 1;
for (int i = 1;i < M;i ++) fr[i] = fr[i - 1] * i % mod , pw[i] = (pw[i - 1] << 1) % mod;
inv[M - 1] = power (fr[M - 1] , mod - 2);
for (int i = M - 2;i >= 1;i --) inv[i] = inv[i + 1] * (i + 1) % mod;
ios::sync_with_stdio (0);
cin.tie (0) , cout.tie (0);
cin >> cid >> T;
while (T --)
{
cin >> n >> m;
for (int i = 1;i <= n;i ++)
cin >> a[i];
sort (a + 1 , a + n + 1);
int ans = 0;
for (int i = 1;i <= n;i ++) // w_i = 1
{
int p = 0;
for (int j = i + 1;j <= n;j ++) if (a[i] < a[j] && a[j] < (a[i] << 1)) // w_j = 2
{
// k > j : n - j (1 / 2)
// i < k < j : j - i - 1 (0 / 1)
// sum = m - 2
int s1 = n - j , s2 = j - i - 1;
if (m - 2 - s1 < 0) continue;
// a_p + a_i < a_j
while (p < n && a[p + 1] + a[i] < a[j])
p ++;
int w = C (n - i - 1 , m - 2 - (n - j));
Add (ans , pw[p] * w % mod);
}
}
cout << (pw[n] - ans + mod) % mod << '\n';
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...