牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)
链接:
https://www.nowcoder.com/acm/contest/139/F
题意:


分析:
转载自:http://tokitsukaze.live/2018/07/19/2018niuke1.F/



代码:
#include <cstdio>
#include <cassert>
#include <algorithm>
using namespace std; /// 注意mod,使用前须调用一次 polysum::init(int M);
namespace polysum {
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
typedef long long ll;
const ll mod=1e9+; /// 取模值
ll powmod(ll a,ll b) {ll res=;a%=mod; assert(b>=); for(;b;b>>=){if(b&)res=res*a%mod;a=a*a%mod;}return res;} const int D=; /// 最高次限制
ll a[D],f[D],g[D],p[D],p1[D],p2[D],b[D],h[D][],C[D];
ll calcn(int d,ll *a,ll n) {
if (n<=d) return a[n];
p1[]=p2[]=;
rep(i,,d+) {
ll t=(n-i+mod)%mod;
p1[i+]=p1[i]*t%mod;
}
rep(i,,d+) {
ll t=(n-d+i+mod)%mod;
p2[i+]=p2[i]*t%mod;
}
ll ans=;
rep(i,,d+) {
ll t=g[i]*g[d-i]%mod*p1[i]%mod*p2[d-i]%mod*a[i]%mod;
if ((d-i)&) ans=(ans-t+mod)%mod;
else ans=(ans+t)%mod;
}
return ans;
}
void init(int M) { /// M:最高次
f[]=f[]=g[]=g[]=;
rep(i,,M+) f[i]=f[i-]*i%mod;
g[M+]=powmod(f[M+],mod-);
per(i,,M+) g[i]=g[i+]*(i+)%mod;
}
ll polysum(ll n,ll *arr,ll m) { // a[0].. a[m] \sum_{i=0}^{n-1} a[i]
for(int i = ; i <= m; i++) a[i] = arr[i];
a[m+]=calcn(m,a,m+);
rep(i,,m+) a[i]=(a[i-]+a[i])%mod;
return calcn(m+,a,n-);
}
ll qpolysum(ll R,ll n,ll *a,ll m) { // a[0].. a[m] \sum_{i=0}^{n-1} a[i]*R^i
if (R==) return polysum(n,a,m);
a[m+]=calcn(m,a,m+);
ll r=powmod(R,mod-),p3=,p4=,c,ans;
h[][]=;h[][]=;
rep(i,,m+) {
h[i][]=(h[i-][]+a[i-])*r%mod;
h[i][]=h[i-][]*r%mod;
}
rep(i,,m+) {
ll t=g[i]*g[m+-i]%mod;
if (i&) p3=((p3-h[i][]*t)%mod+mod)%mod,p4=((p4-h[i][]*t)%mod+mod)%mod;
else p3=(p3+h[i][]*t)%mod,p4=(p4+h[i][]*t)%mod;
}
c=powmod(p4,mod-)*(mod-p3)%mod;
rep(i,,m+) h[i][]=(h[i][]+h[i][]*c)%mod;
rep(i,,m+) C[i]=h[i][];
ans=(calcn(m,C,n)*powmod(R,n)-c)%mod;
if (ans<) ans+=mod;
return ans;
}
} typedef long long int LLI;
const LLI MOD = polysum::mod;
const int UP = 1e3 + ;
LLI a[UP], b[UP]; int main() {
polysum::init(UP);
int n;
while(~scanf("%d", &n)) {
for(int i = ; i <= n; i++) scanf("%lld", &a[i]);
sort(a+, a+n+);
LLI ans = , prod = ;
for(int i = ; i <= n; i++) {
if(a[i] == a[i-]) {
prod = prod * a[i] % MOD;
continue;
}
for(int x = ; x <= n-i+; x++) {
b[x] = (polysum::powmod(x, n-i+) - polysum::powmod(x-, n-i+) + MOD) % MOD * x % MOD;
}
LLI temp = (polysum::polysum(a[i]+, b, n-i+) - polysum::polysum(a[i-]+, b, n-i+) + MOD) % MOD;
ans = (ans + prod * temp % MOD) % MOD;
prod = prod * a[i] % MOD;
}
printf("%lld\n", ans);
}
return ;
}
拉格朗日插值法模板(杜教版):
/// 注意mod,使用前须调用一次 polysum::init(int M);
namespace polysum {
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
typedef long long ll;
const ll mod=1e9+; /// 取模值
ll powmod(ll a,ll b) {ll res=;a%=mod; assert(b>=); for(;b;b>>=){if(b&)res=res*a%mod;a=a*a%mod;}return res;} const int D=; /// 最高次限制
ll a[D],f[D],g[D],p[D],p1[D],p2[D],b[D],h[D][],C[D];
ll calcn(int d,ll *a,ll n) {
if (n<=d) return a[n];
p1[]=p2[]=;
rep(i,,d+) {
ll t=(n-i+mod)%mod;
p1[i+]=p1[i]*t%mod;
}
rep(i,,d+) {
ll t=(n-d+i+mod)%mod;
p2[i+]=p2[i]*t%mod;
}
ll ans=;
rep(i,,d+) {
ll t=g[i]*g[d-i]%mod*p1[i]%mod*p2[d-i]%mod*a[i]%mod;
if ((d-i)&) ans=(ans-t+mod)%mod;
else ans=(ans+t)%mod;
}
return ans;
}
void init(int M) { /// M:最高次
f[]=f[]=g[]=g[]=;
rep(i,,M+) f[i]=f[i-]*i%mod;
g[M+]=powmod(f[M+],mod-);
per(i,,M+) g[i]=g[i+]*(i+)%mod;
}
ll polysum(ll n,ll *arr,ll m) { // a[0].. a[m] \sum_{i=0}^{n-1} a[i]
for(int i = ; i <= m; i++) a[i] = arr[i];
a[m+]=calcn(m,a,m+);
rep(i,,m+) a[i]=(a[i-]+a[i])%mod;
return calcn(m+,a,n-);
}
ll qpolysum(ll R,ll n,ll *a,ll m) { // a[0].. a[m] \sum_{i=0}^{n-1} a[i]*R^i
if (R==) return polysum(n,a,m);
a[m+]=calcn(m,a,m+);
ll r=powmod(R,mod-),p3=,p4=,c,ans;
h[][]=;h[][]=;
rep(i,,m+) {
h[i][]=(h[i-][]+a[i-])*r%mod;
h[i][]=h[i-][]*r%mod;
}
rep(i,,m+) {
ll t=g[i]*g[m+-i]%mod;
if (i&) p3=((p3-h[i][]*t)%mod+mod)%mod,p4=((p4-h[i][]*t)%mod+mod)%mod;
else p3=(p3+h[i][]*t)%mod,p4=(p4+h[i][]*t)%mod;
}
c=powmod(p4,mod-)*(mod-p3)%mod;
rep(i,,m+) h[i][]=(h[i][]+h[i][]*c)%mod;
rep(i,,m+) C[i]=h[i][];
ans=(calcn(m,C,n)*powmod(R,n)-c)%mod;
if (ans<) ans+=mod;
return ans;
}
}
牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)的更多相关文章
- 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...
- 牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)
链接: https://www.nowcoder.com/acm/contest/139/J 题意: 给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R( ...
- 牛客网多校训练第一场 E - Removal(线性DP + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/E 题意: 给出一个n(1≤n≤1e5)个整数(范围是1至10)的序列,求从中移除m(1≤m≤min(n-1, ...
- 牛客网多校训练第一场 D - Two Graphs
链接: https://www.nowcoder.com/acm/contest/139/D 题意: 两个无向简单图都有n(1≤n≤8)个顶点,图G1有m1条边,图G2有m2条边,问G2有多少个子图与 ...
- 牛客网多校训练第一场 B - Symmetric Matrix(dp)
链接: https://www.nowcoder.com/acm/contest/139/B 题意: 求满足以下条件的n*n矩阵A的数量模m:A(i,j) ∈ {0,1,2}, 1≤i,j≤n.A(i ...
- 牛客网多校训练第一场 A - Monotonic Matrix(Lindström–Gessel–Viennot lemma)
链接: https://www.nowcoder.com/acm/contest/139/A 题意: 求满足以下条件的n*m矩阵A的数量模(1e9+7):A(i,j) ∈ {0,1,2}, 1≤i≤n ...
- 牛客网多校训练第二场D Kth Minimum Clique
链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...
- 牛客网多校训练第九场H Cutting Bamboos
题目链接:https://ac.nowcoder.com/acm/contest/889/H 题意:给出n颗竹子的高度,q次询问,每次询问给出l,r,x,y,每次选取[l,r]中的竹子,砍y次砍掉所有 ...
- 牛客网多校第5场 F take 【思维+数学期望】
题目:戳这里 思路来源:视频讲解 题意:有n个箱子按1...n标号,每个箱子有大小为di的钻石概率为pi,我们初始有个大小为0的钻石,从1到n按顺序打开箱子,遇到比手中大的箱子就换,求交换次数的数学期 ...
随机推荐
- Centos7 ftp服务器搭建
1.使用yum安装ftp服务端: yum install -y vsftpd 2.使用yum安装ftp客户端: yum install -y ftp.x86_64 3.开启ftp服务设置开机启动并查看 ...
- Golang教程:switch 语句
switch 是一个条件语句,用于将一个表达式的求值结果与可能的值的列表进行匹配,并根据匹配结果执行相应的代码.可以认为 switch 语句是编写多个 if-else 子句的替代方式. 举例是说明问题 ...
- [APIO2018] Circle selection 选圆圈
Description 给出 \(n\) 个圆 \((x_i,y_i,r_i)\) 每次重复以下步骤: 找出半径最大的圆,并删除与这个圆相交的圆 求出每一个圆是被哪个圆删除的 Solution \(k ...
- ASP.NET MVC4 新手入门教程之三 ---3.添加视图
在这一节你要修改HelloWorldController类要使用的视图模板文件来干净封装生成 HTML 响应到客户端的过程. 您将创建一个使用Razor 视图引擎介绍 ASP.NET MVC 3 的视 ...
- C# wx获取token基本方法
#region 请求Url,不发送数据 /// <summary> /// 请求Url,不发送数据 /// </summary> public static string Re ...
- Spring.Net IOC基本应用和在MVC4中的应用
1.Spring.Net的IOC简单应用 新建一个解决方案添加一个控制台应用程序和一个业务层一个业务层的接口层,通过配置,让控制台应用程序调业务层的方法 1)新建如下图所示,BLL为业务层,通过Spr ...
- WPF MVVM 之理解(数据绑定)
(申明:最近在做一个练习,写点东西,谨供参考.) 1.界面展示:其中的布局和样式就不说了,重点在MVVM架构和数据绑定(Model层使用EF(Entity Framework)实体框架,不做介绍). ...
- 基于easyUI实现系统日志管理
此文章是基于 EasyUI+Knockout实现经典表单的查看.编辑 一. 相关文件介绍 1. log.jsp:系统日志管理界面 <!DOCTYPE html PUBLIC "-//W ...
- MySQL聚合函数在计算时,不会自动匹配与之相对应的数据
学习mysql过程中遇到了一个困惑,纠结了我半天时间,刚刚又重新复习了一下,终于知道问题所在 以下是一个需求: 取得平均薪水最高的部门的部门编号 代码如下: select deptno, avg(sa ...
- 03_Adaptive注解
[Adaptive注解] package com.alibaba.dubbo.common.extension; import com.alibaba.dubbo.common.URL; import ...