牛客网多校训练第一场 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按顺序打开箱子,遇到比手中大的箱子就换,求交换次数的数学期 ...
随机推荐
- 酷炫字体背景图的实现——神奇的background-clip: text
愉快的时光总是飞快,七天小长假已接近尾声,抓住假期的尾巴,再学个新知识点——css的background-clip: text属性...会不会有种陌生的感觉,毕竟在我们的印象里,background- ...
- Python爬虫-播报天气信息(生成exe文件)待续
#!/usr/bin/env python3 # -*- coding : utf-8 -*- '''1.从https://my.oschina.net/joanfen/blog/140364获取要播 ...
- shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃
这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...
- [转]Shared——React Native与原生关系理解与对比
零.关系理解 这个是我对RN和原生关系的理解.简单解释下这个图. RN js编写完业务代码后,通过react-native bundle命令,将代码分别编译成一个index.ios.bundle和in ...
- [WC2016]挑战NPC
Sol 这做法我是想不到\(TAT\) 每个筐子拆成三个相互连边 球向三个筐子连边 然后跑一般图最大匹配 这三个筐子间最多有一个匹配 那么显然每个球一定会放在一个筐子里,一定有一个匹配 如果筐子间有匹 ...
- C语言--清理getchar缓存
getchar()采用了缓冲区,而getch()才是立即获取,所以要想再用getchar()获取正确的值必须先清空缓冲区,如果是windows操作系统,用fflush(stdin)函数或rewind( ...
- Ajax与jsonp
1.ajax的概念 AJAX = Asynchronous Javascript And XML (AJAX = 异步 javascript 和 xml) AJAX是一种无需重新加载整个网页的 ...
- Mavn 使用介绍
1 Maven介绍 1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目 ...
- canvas画布基础知识
<canvas> </canvas>标签用于绘制图像(通过脚本,通常是 JavaScript). <canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - ...
- Linux基础之-正则表达式(grep,sed,awk)
一. 正则表达式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式是对字符串操作的一种逻辑公 ...