#dp#CF1437F Emotional Fishermen

题目传送门


分析

有些数是固定的,而其它数可以根据这些固定的数而随意排列,将原序列排序后,当小于等于 \frac{a_i},但大于 ai2 时,它只能放在 ai 前一个固定数之后,那么我们考虑枚举上一个固定数 aj,那么它就能产生 An1lenlen1len 的贡献,可以前缀和优化到 O(n)


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int mod=998244353,N=5011;
int n,fac[N],inv[N],a[N],dp[N],s[N];
int iut(){
	int ans=0; char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=ans*10+c-48,c=getchar();
	return ans;
}
int main(){
    n=iut(),fac[0]=inv[0]=fac[1]=inv[1]=1;
    for (int i=1;i<=n;++i) a[i]=iut();
    sort(a+1,a+1+n);
    if (2*a[n-1]>a[n]) return !printf("0");
    for (int i=2;i<=n;++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
    for (int i=2;i<=n;++i) fac[i]=1ll*fac[i-1]*i%mod,inv[i]=1ll*inv[i]*inv[i-1]%mod;
    dp[0]=1,s[0]=fac[n-1];
    for (int i=1,len=1;i<=n;++i){
        while (2*a[len]<=a[i]&&len<=n) ++len;
        dp[i]=1ll*inv[n-len]*s[len-1]%mod;
        s[i]=(s[i-1]+1ll*fac[n-1-len]*dp[i])%mod;
    }
    return !printf("%d",dp[n]);
}
posted @   lemondinosaur  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2024-02-27 #分块,二分#洛谷 3863 序列
2022-02-27 #排列组合,背包#CF232B Table
2022-02-27 #树形dp,直径#51nod 1812 树的双直径
点击右上角即可分享
微信分享提示