链接:

https://www.nowcoder.com/acm/contest/139/F

题意:

分析:

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

代码:

  1. #include <cstdio>
  2. #include <cassert>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. /// 注意mod,使用前须调用一次 polysum::init(int M);
  7. namespace polysum {
  8. #define rep(i,a,n) for (int i=a;i<n;i++)
  9. #define per(i,a,n) for (int i=n-1;i>=a;i--)
  10. typedef long long ll;
  11. const ll mod=1e9+; /// 取模值
  12. 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;}
  13.  
  14. const int D=; /// 最高次限制
  15. ll a[D],f[D],g[D],p[D],p1[D],p2[D],b[D],h[D][],C[D];
  16. ll calcn(int d,ll *a,ll n) {
  17. if (n<=d) return a[n];
  18. p1[]=p2[]=;
  19. rep(i,,d+) {
  20. ll t=(n-i+mod)%mod;
  21. p1[i+]=p1[i]*t%mod;
  22. }
  23. rep(i,,d+) {
  24. ll t=(n-d+i+mod)%mod;
  25. p2[i+]=p2[i]*t%mod;
  26. }
  27. ll ans=;
  28. rep(i,,d+) {
  29. ll t=g[i]*g[d-i]%mod*p1[i]%mod*p2[d-i]%mod*a[i]%mod;
  30. if ((d-i)&) ans=(ans-t+mod)%mod;
  31. else ans=(ans+t)%mod;
  32. }
  33. return ans;
  34. }
  35. void init(int M) { /// M:最高次
  36. f[]=f[]=g[]=g[]=;
  37. rep(i,,M+) f[i]=f[i-]*i%mod;
  38. g[M+]=powmod(f[M+],mod-);
  39. per(i,,M+) g[i]=g[i+]*(i+)%mod;
  40. }
  41. ll polysum(ll n,ll *arr,ll m) { // a[0].. a[m] \sum_{i=0}^{n-1} a[i]
  42. for(int i = ; i <= m; i++) a[i] = arr[i];
  43. a[m+]=calcn(m,a,m+);
  44. rep(i,,m+) a[i]=(a[i-]+a[i])%mod;
  45. return calcn(m+,a,n-);
  46. }
  47. ll qpolysum(ll R,ll n,ll *a,ll m) { // a[0].. a[m] \sum_{i=0}^{n-1} a[i]*R^i
  48. if (R==) return polysum(n,a,m);
  49. a[m+]=calcn(m,a,m+);
  50. ll r=powmod(R,mod-),p3=,p4=,c,ans;
  51. h[][]=;h[][]=;
  52. rep(i,,m+) {
  53. h[i][]=(h[i-][]+a[i-])*r%mod;
  54. h[i][]=h[i-][]*r%mod;
  55. }
  56. rep(i,,m+) {
  57. ll t=g[i]*g[m+-i]%mod;
  58. if (i&) p3=((p3-h[i][]*t)%mod+mod)%mod,p4=((p4-h[i][]*t)%mod+mod)%mod;
  59. else p3=(p3+h[i][]*t)%mod,p4=(p4+h[i][]*t)%mod;
  60. }
  61. c=powmod(p4,mod-)*(mod-p3)%mod;
  62. rep(i,,m+) h[i][]=(h[i][]+h[i][]*c)%mod;
  63. rep(i,,m+) C[i]=h[i][];
  64. ans=(calcn(m,C,n)*powmod(R,n)-c)%mod;
  65. if (ans<) ans+=mod;
  66. return ans;
  67. }
  68. }
  69.  
  70. typedef long long int LLI;
  71. const LLI MOD = polysum::mod;
  72. const int UP = 1e3 + ;
  73. LLI a[UP], b[UP];
  74.  
  75. int main() {
  76. polysum::init(UP);
  77. int n;
  78. while(~scanf("%d", &n)) {
  79. for(int i = ; i <= n; i++) scanf("%lld", &a[i]);
  80. sort(a+, a+n+);
  81. LLI ans = , prod = ;
  82. for(int i = ; i <= n; i++) {
  83. if(a[i] == a[i-]) {
  84. prod = prod * a[i] % MOD;
  85. continue;
  86. }
  87. for(int x = ; x <= n-i+; x++) {
  88. b[x] = (polysum::powmod(x, n-i+) - polysum::powmod(x-, n-i+) + MOD) % MOD * x % MOD;
  89. }
  90. LLI temp = (polysum::polysum(a[i]+, b, n-i+) - polysum::polysum(a[i-]+, b, n-i+) + MOD) % MOD;
  91. ans = (ans + prod * temp % MOD) % MOD;
  92. prod = prod * a[i] % MOD;
  93. }
  94. printf("%lld\n", ans);
  95. }
  96. return ;
  97. }

拉格朗日插值法模板(杜教版):

  1. /// 注意mod,使用前须调用一次 polysum::init(int M);
  2. namespace polysum {
  3. #define rep(i,a,n) for (int i=a;i<n;i++)
  4. #define per(i,a,n) for (int i=n-1;i>=a;i--)
  5. typedef long long ll;
  6. const ll mod=1e9+; /// 取模值
  7. 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;}
  8.  
  9. const int D=; /// 最高次限制
  10. ll a[D],f[D],g[D],p[D],p1[D],p2[D],b[D],h[D][],C[D];
  11. ll calcn(int d,ll *a,ll n) {
  12. if (n<=d) return a[n];
  13. p1[]=p2[]=;
  14. rep(i,,d+) {
  15. ll t=(n-i+mod)%mod;
  16. p1[i+]=p1[i]*t%mod;
  17. }
  18. rep(i,,d+) {
  19. ll t=(n-d+i+mod)%mod;
  20. p2[i+]=p2[i]*t%mod;
  21. }
  22. ll ans=;
  23. rep(i,,d+) {
  24. ll t=g[i]*g[d-i]%mod*p1[i]%mod*p2[d-i]%mod*a[i]%mod;
  25. if ((d-i)&) ans=(ans-t+mod)%mod;
  26. else ans=(ans+t)%mod;
  27. }
  28. return ans;
  29. }
  30. void init(int M) { /// M:最高次
  31. f[]=f[]=g[]=g[]=;
  32. rep(i,,M+) f[i]=f[i-]*i%mod;
  33. g[M+]=powmod(f[M+],mod-);
  34. per(i,,M+) g[i]=g[i+]*(i+)%mod;
  35. }
  36. ll polysum(ll n,ll *arr,ll m) { // a[0].. a[m] \sum_{i=0}^{n-1} a[i]
  37. for(int i = ; i <= m; i++) a[i] = arr[i];
  38. a[m+]=calcn(m,a,m+);
  39. rep(i,,m+) a[i]=(a[i-]+a[i])%mod;
  40. return calcn(m+,a,n-);
  41. }
  42. ll qpolysum(ll R,ll n,ll *a,ll m) { // a[0].. a[m] \sum_{i=0}^{n-1} a[i]*R^i
  43. if (R==) return polysum(n,a,m);
  44. a[m+]=calcn(m,a,m+);
  45. ll r=powmod(R,mod-),p3=,p4=,c,ans;
  46. h[][]=;h[][]=;
  47. rep(i,,m+) {
  48. h[i][]=(h[i-][]+a[i-])*r%mod;
  49. h[i][]=h[i-][]*r%mod;
  50. }
  51. rep(i,,m+) {
  52. ll t=g[i]*g[m+-i]%mod;
  53. if (i&) p3=((p3-h[i][]*t)%mod+mod)%mod,p4=((p4-h[i][]*t)%mod+mod)%mod;
  54. else p3=(p3+h[i][]*t)%mod,p4=(p4+h[i][]*t)%mod;
  55. }
  56. c=powmod(p4,mod-)*(mod-p3)%mod;
  57. rep(i,,m+) h[i][]=(h[i][]+h[i][]*c)%mod;
  58. rep(i,,m+) C[i]=h[i][];
  59. ans=(calcn(m,C,n)*powmod(R,n)-c)%mod;
  60. if (ans<) ans+=mod;
  61. return ans;
  62. }
  63. }

牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)的更多相关文章

  1. 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)

    链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...

  2. 牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)

    链接: https://www.nowcoder.com/acm/contest/139/J 题意: 给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R( ...

  3. 牛客网多校训练第一场 E - Removal(线性DP + 重复处理)

    链接: https://www.nowcoder.com/acm/contest/139/E 题意: 给出一个n(1≤n≤1e5)个整数(范围是1至10)的序列,求从中移除m(1≤m≤min(n-1, ...

  4. 牛客网多校训练第一场 D - Two Graphs

    链接: https://www.nowcoder.com/acm/contest/139/D 题意: 两个无向简单图都有n(1≤n≤8)个顶点,图G1有m1条边,图G2有m2条边,问G2有多少个子图与 ...

  5. 牛客网多校训练第一场 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 ...

  6. 牛客网多校训练第一场 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 ...

  7. 牛客网多校训练第二场D Kth Minimum Clique

    链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...

  8. 牛客网多校训练第九场H Cutting Bamboos

    题目链接:https://ac.nowcoder.com/acm/contest/889/H 题意:给出n颗竹子的高度,q次询问,每次询问给出l,r,x,y,每次选取[l,r]中的竹子,砍y次砍掉所有 ...

  9. 牛客网多校第5场 F take 【思维+数学期望】

    题目:戳这里 思路来源:视频讲解 题意:有n个箱子按1...n标号,每个箱子有大小为di的钻石概率为pi,我们初始有个大小为0的钻石,从1到n按顺序打开箱子,遇到比手中大的箱子就换,求交换次数的数学期 ...

随机推荐

  1. 酷炫字体背景图的实现——神奇的background-clip: text

    愉快的时光总是飞快,七天小长假已接近尾声,抓住假期的尾巴,再学个新知识点——css的background-clip: text属性...会不会有种陌生的感觉,毕竟在我们的印象里,background- ...

  2. Python爬虫-播报天气信息(生成exe文件)待续

    #!/usr/bin/env python3 # -*- coding : utf-8 -*- '''1.从https://my.oschina.net/joanfen/blog/140364获取要播 ...

  3. shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃

    这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...

  4. [转]Shared——React Native与原生关系理解与对比

    零.关系理解 这个是我对RN和原生关系的理解.简单解释下这个图. RN js编写完业务代码后,通过react-native bundle命令,将代码分别编译成一个index.ios.bundle和in ...

  5. [WC2016]挑战NPC

    Sol 这做法我是想不到\(TAT\) 每个筐子拆成三个相互连边 球向三个筐子连边 然后跑一般图最大匹配 这三个筐子间最多有一个匹配 那么显然每个球一定会放在一个筐子里,一定有一个匹配 如果筐子间有匹 ...

  6. C语言--清理getchar缓存

    getchar()采用了缓冲区,而getch()才是立即获取,所以要想再用getchar()获取正确的值必须先清空缓冲区,如果是windows操作系统,用fflush(stdin)函数或rewind( ...

  7. Ajax与jsonp

    1.ajax的概念 AJAX = Asynchronous Javascript And XML (AJAX  =  异步  javascript  和 xml) AJAX是一种无需重新加载整个网页的 ...

  8. Mavn 使用介绍

      1 Maven介绍 1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目 ...

  9. canvas画布基础知识

    <canvas> </canvas>标签用于绘制图像(通过脚本,通常是 JavaScript). <canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - ...

  10. Linux基础之-正则表达式(grep,sed,awk)

    一. 正则表达式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式是对字符串操作的一种逻辑公 ...