首页 > 其他分享 >CF938E-组合数

CF938E-组合数

时间:2024-03-21 12:11:06浏览次数:23  
标签:组合 int inv binom CF938E ll fact MOD

link:https://codeforces.com/contest/938/problem/E
题意:给一个序列 \(a\) ,按如下方式计算 \(f_a\):

  • 初始 \(f_a=0,M=1\)
  • 对每个 \(2\leq i\leq n\),如果 \(a_M<a_i\),\(f_a\to f_a+a_M\),然后 \(M=i\)
    对所有 \(a\) 的排列计算 \(f_a\) 并其在模 \(10^9+7\) 下的和。
    \(1\leq n\leq 10^6,1\leq a_i\leq 10^9\)

对每个序列的 \(f_a\) 的值是一段从 \(a_1\) 开始的上升序列的和,并且 \(a\) 的最大值没有贡献,反过来考虑每个 \(a_i<\max(a)\) 的贡献:

  • 设 \(a_i\) 在位置 \(j\) 处出现,要产生贡献当且仅当前面的数严格比 \(a_i\) 小,假设这样的数有 \(s_i\) 个,则有 \(s_i!/(s_i-(j-1))!\) 种放法,后面的数随便放,有 \((n-j)!\) 种,$$\sum_{j=1}^n \frac{s_i!(n-j)!}{(s_i-j+1)!}=s_i!\sum_{j=1}^n \frac{(n-j)!}{(s_i-j+1)!}\frac{(n-1-s_i)!}{(n-1-s_i)!}=s_i!(n-1-s_i)! \sum_{j=1}^n \binom{n-j}{n-1-s_i}$$经典上指标求和,翻转指标,从\(\binom{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}\)与\(\binom{n}{-1}=0\),为 可以倒推:$$s_i!(n-1-s_i)!\sum_{j=0}^{n-1}\binom{j}{n-1-s_i}=s_i!(n-1-s_i)!\binom{n}{n-s_i}$$
  • 对每个值计算贡献即可
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
const int N=1e6+55;
const int MOD=1e9+7;
int ksm(int a,int b){
    int ret=1;a%=MOD;
    for(;b;b>>=1,a=(ll)a*a%MOD)if(b&1)ret=(ll)ret*a%MOD;
    return ret;
}
int n,a[N],fact[N],inv_fact[N];
map<int,int> S;
int C(int n,int k){
    if(k>n)return 0;
    return (ll)fact[n]*inv_fact[k]%MOD*inv_fact[n-k]%MOD;
}
int main(){
    fastio;
    fact[0]=1;
    rep(i,1,N-5)fact[i]=(ll)fact[i-1]*i%MOD;
    inv_fact[N-5]=ksm(fact[N-5],MOD-2);
    for(int i=N-5;i>=1;i--)inv_fact[i-1]=(ll)inv_fact[i]*i%MOD;
    cin>>n;
    int mx=0;
    rep(i,1,n){
        cin>>a[i];
        S[a[i]]++;
        mx=max(mx,a[i]);
    }
    int cnt=0,ans=0;
    for(auto [x,c]:S)if(x!=mx){
        ans=(ans+(ll)x*fact[cnt]%MOD*fact[n-cnt-1]%MOD*C(n,n-cnt)%MOD*c%MOD)%MOD;
        cnt+=c;
    }
    cout<<ans;
    return 0;
}

标签:组合,int,inv,binom,CF938E,ll,fact,MOD
From: https://www.cnblogs.com/yoshinow2001/p/18087087

相关文章

  • Copula估计边缘分布模拟收益率计算投资组合风险价值VaR与期望损失ES|附代码数据
    全文链接:http://tecdat.cn/?p=24753最近我们被客户要求撰写关于风险价值的研究报告,包括一些图形和统计输出。在这项工作中,我通过创建一个包含四只基金的模型来探索copula,这些基金跟踪股票、债券、美元和商品的市场指数摘要然后,我使用该模型生成模拟值,并使用实际收益和模拟收......
  • 代码随想录 第二十四天| ●回溯 理论基础 ● 77. 组合
    回溯理论基础:回溯三部曲:制定回溯函数的参数和返回值确定回溯终止条件确定回溯遍历过程 回溯模板voidbacktracking(参数){if(终止条件){存放结果;return;}for(选择:本层集合中元素(树中节点孩......
  • 组合设计模式Java代码快速开始
    组合模式介绍使用组合模式可以让用户可以使用统一的方式处理整个树形结构的个别对象和组合对象,从而简化客户端的操作。并且扩展性好当需要处理的对象是树形结构时可以考虑使用组合模式。节点和叶子节点存在很大差异的情况下不建议使用组合模式。代码举例不使用组合模式举例......
  • 计数组合【2024蓝桥杯0基础】-学习笔记
    文章目录计数原理排列数组合数组合数性质例题分析代码复现例题2状态分析代码复现常见的排列组合问题圆排列代码复现第二类斯特林数感悟计数原理排列数组合数组合数性质例题分析代码复现defksm(a,b,c):ans=1%cwhileb!=0:......
  • CF785D - Anton and School - 2 | 组合数
    links给定一个只包含(和)的括号序列,求形如(())、((())),的子序列总数。答案取模。\(n\leq2\times10^5\)\(O(n^2)\)的暴力显然,关键是如何计算组合数。枚举最后一个(,设左边还有\(x\)个(,右边有\(y\)个),则答案为\[\sum\limits_{i=1}^{\min(x+1,......
  • 代码随想录算法训练营day27 | leetcode 39. 组合总和、40. 组合总和 II、131. 分割回
    目录题目链接:39.组合总和-中等题目链接:40.组合总和II-中等题目链接:131.分割回文串-中等题目链接:39.组合总和-中等题目描述:给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形......
  • C#遍历输出从n个数中选择m个数的可以重复取数的所有组合
    目录1.可重复取数的C(n,m)组合数2.编程实现C(5,3)可重复取数的组合并遍历输出1.可重复取数的C(n,m)组合数        要计算从n个数中任取m个数的可以重复取数的组合数,可以使用数学中的组合公式。在这种情况下,我们可以将问题看作是从n个数中选择m个数,其中每个数可......
  • 代码随想录算法训练营第27天|39. 组合总和|40.组合总和II|131.分割回文串
    代码随想录算法训练营第27天|39.组合总和|40.组合总和II|131.分割回文串详细布置39.组合总和本题是集合里元素可以用无数次,那么和组合问题的差别其实仅在于startIndex上的控制题目链接/文章讲解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%9......
  • luoguP3330 [ZJOI2011] 看电影--组合数学--高精度
    \(luoguP3330\)[ZJOI2011]看电影废了老命想题解$$luogu$$$$HZOI$$题意到了难得的假期,小白班上组织大家去看电影。但由于假期里看电影的人太多,很难做到让全班看上同一场电影。最后大家在一个偏僻的小胡同里找到了一家电影院,但这家电影院分配座位的方式很特殊,具体方式如......
  • 分享一个之前开发的react键盘事件的快捷键实现,组合键,支持防抖和节流,通过自定义hooks实
    npm包地址:linkgithub地址:linkreact-khooksGettingStarted......