CF938E-组合数
link:https://codeforces.com/contest/938/problem/E
题意:给一个序列
- 初始
- 对每个
,如果 , ,然后
对所有 的排列计算 并其在模 下的和。
对每个序列的
- 设
在位置 处出现,要产生贡献当且仅当前面的数严格比 小,假设这样的数有 个,则有 种放法,后面的数随便放,有 种, 经典上指标求和,翻转指标,从 与 ,为 可以倒推: - 对每个值计算贡献即可
#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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-03-21 [比赛记录]2020-2021 Summer Petrozavodsk Camp, Day 6: Korean Contest