【洛谷5437】【XR-2】约定(拉格朗日插值)

题面

洛谷

题解

首先发现每条边除了边权之外都是等价的,所以可以考虑每一条边的出现次数。

显然钦定一条边之后构成生成树的方案数是\(2*n^{n-3}\)。可以直接\(purfer\)序列算。

也可以发现每一条边的出现次数相等,树的总数是\(n^{n-2}\),每次出现\(n-1\)条边,每条边又是等价的。

也可以算出上面这个值。

于是要算的东西就变成了

\[\displaystyle \sum_{i=1}^n\sum_{j=i+1}^n(i+j)^k
\]

这个东西不对称,很不方便计算,所以可以变成:

\[\frac{1}{2}(\sum_{i=1}^n \sum_{j=1}^n (i+j)^k-\sum_{i=1}^n (i+i)^k)
\]

\(k\)次方这个东西显然是个\(k+1\)次多项式,可以套进去直接拉格朗日插值计算。

拆一下变成了\(\displaystyle \sum_{i=1}^{n} (i-1) i^k+\sum_{i=n+1}^{2n}(2n-i+1)i^k-\sum_{i=1}^n 2^ki^k\)。

然后预处理之后,可以用拉格朗日插值可以在\(O(k)\)的复杂度里算出上面的式子,然后带回去算期望就行了。

然后这里怎么拉格朗日插值。

以第一个函数为例。

令\(f(n)=\sum_{i=1}^n (i-1)i^k\),因为\(i^{k+1}\)次方大概是一个\(k+2\)次多项式,所以我们需要\(k+3\)个值,那么显然这个函数的前\(k+3\)项我们在预处理之后是可以提前算出来的。

然后根据拉格朗日插值的公式,对于一个\(k\)次多项式而言:

\[P(x)=\sum_{i=1}^{k+1}P(x_i)\prod_{j=1,j\neq i}^{k+1}\frac{x-x_j}{x_i-x_j}
\]

然后因为我们选择的值是连续的若干项,所以可以简单的写成:

\[P(x)=\sum_{i=1}^{k+1}P(x_i)\frac{(-1)^{k+1-i}}{(i-1)!(k+1-i)!}\prod_{j=1,j\neq i}^{k+1}(x-x_j)
\]

在这题里,我们都已经知道\(x\)是\(n\)了,所以后半部分的\(prod\)可以用前后缀的方式快速预处理出来,这样子我们就可以\(O(k)\)的计算前面的部分了。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define MOD 998244353
  5. #define MAX 10000100
  6. inline int read()
  7. {
  8. int x=0;bool t=false;char ch=getchar();
  9. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  10. if(ch=='-')t=true,ch=getchar();
  11. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  12. return t?-x:x;
  13. }
  14. int n,K,N,ans;
  15. int inv[MAX],jv[MAX],suf[MAX],pre[MAX];
  16. bool zs[MAX];
  17. int pri[MAX],tot,pw[MAX];
  18. int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
  19. void Sieve(int n)
  20. {
  21. pw[1]=1;
  22. for(int i=2;i<=n;++i)
  23. {
  24. if(!zs[i])pri[++tot]=i,pw[i]=fpow(i,K);
  25. for(int j=1;j<=tot&&i*pri[j]<=n;++j)
  26. {
  27. zs[i*pri[j]]=true;
  28. pw[i*pri[j]]=1ll*pw[i]*pw[pri[j]]%MOD;
  29. if(i%pri[j]==0)break;
  30. }
  31. }
  32. }
  33. int P[MAX];
  34. int calc(int n)
  35. {
  36. int ret=0;pre[0]=suf[N+1]=1;
  37. for(int i=1;i<=N;++i)pre[i]=1ll*pre[i-1]*(n-i+MOD)%MOD;
  38. for(int i=N;i;--i)suf[i]=1ll*suf[i+1]*(n-i+MOD)%MOD;
  39. for(int i=1,d=((N+1)&1)?MOD-1:1;i<=N;++i,d=MOD-d)
  40. ret=(ret+1ll*P[i]*d%MOD*jv[i-1]%MOD*jv[N-i]%MOD*pre[i-1]%MOD*suf[i+1])%MOD;
  41. return ret;
  42. }
  43. int main()
  44. {
  45. n=read();K=read();N=K+3;
  46. //for(int i=1;i<=n;++i)ans=(ans+1ll*(i-1)*fpow(i,K))%MOD;
  47. //for(int i=n+1;i<=n+n;++i)ans=(ans+1ll*(n+n-i+1)*fpow(i,K))%MOD;
  48. //for(int i=1;i<=n;++i)ans=(ans+MOD-fpow(2*i,K))%MOD;
  49. Sieve(N);inv[0]=inv[1]=jv[0]=1;
  50. for(int i=2;i<=N;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
  51. for(int i=1;i<=N;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;
  52. for(int i=1;i<=N;++i)P[i]=(P[i-1]+1ll*(i-1)*pw[i])%MOD;
  53. ans=(ans+calc(n))%MOD;
  54. for(int i=1;i<=N;++i)P[i]=(P[i-1]+1ll*(0ll+n+n-i+1)*pw[i])%MOD;
  55. ans=(ans+calc((n+n)%MOD))%MOD;
  56. ans=(ans+MOD-calc(n))%MOD;
  57. for(int i=1;i<=N;++i)P[i]=(P[i-1]+1ll*pw[i]*pw[2])%MOD;
  58. ans=(ans+MOD-calc(n))%MOD;
  59. ans=1ll*ans*fpow(n,MOD-2)%MOD;
  60. printf("%d\n",ans);
  61. return 0;
  62. }

【洛谷5437】【XR-2】约定(拉格朗日插值)的更多相关文章

  1. [洛谷P4781]【模板】拉格朗日插值

    题目大意:给你$n(n\leqslant2000)$个点,要你求$n-1$次经过这$n$个点的多项式在$k$处的值 题解:$Lagrange$插值:$$f_x=\sum\limits_{i=1}^ky ...

  2. 洛谷P4781 【模板】拉格朗日插值(拉格朗日插值)

    题意 题目链接 Sol 记得NJU有个特别强的ACM队叫拉格朗,总感觉少了什么.. 不说了直接扔公式 \[f(x) = \sum_{i = 1}^n y_i \prod_{j \not = i} \f ...

  3. 洛谷P5437/5442 约定(概率期望,拉格朗日插值,自然数幂)

    题目大意:$n$ 个点的完全图,点 $i$ 和点 $j$ 的边权为 $(i+j)^k$.随机一个生成树,问这个生成树边权和的期望对 $998244353$ 取模的值. 对于P5437:$1\le n\ ...

  4. 洛谷 P7116 - [NOIP2020] 微信步数(拉格朗日插值)

    洛谷题面传送门 我竟然独立切掉了这道题!incredible! 纪念我逝去的一上午(NOIP 总时长 4.5h,这题做了我整整 4.5h) 首先讲一下现场我想的 80 分的做法,虽然最后挂成了 65 ...

  5. 洛谷 P5469 - [NOI2019] 机器人(区间 dp+拉格朗日插值)

    洛谷题面传送门 神仙题,放在 D1T2 可能略难了一点( 首先显然对于 P 型机器人而言,将它放在 \(i\) 之后它会走到左边第一个严格 \(>a_i\) 的位置,对于 Q 型机器人而言,将它 ...

  6. 洛谷 P3270 - [JLOI2016]成绩比较(容斥原理+组合数学+拉格朗日插值)

    题面传送门 考虑容斥.我们记 \(a_i\) 为钦定 \(i\) 个人被 B 神碾压的方案数,如果我们已经求出了 \(a_i\) 那么一遍二项式反演即可求出答案,即 \(ans=\sum\limits ...

  7. LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想

    题目:https://loj.ac/problem/2473 https://www.luogu.org/problemnew/show/P4365 参考:https://blog.csdn.net/ ...

  8. 洛谷P5158 【模板】多项式快速插值

    题面 传送门 前置芝士 拉格朗日插值,多项式多点求值 题解 首先根据拉格朗日插值公式我们可以暴力\(O(n^2)\)插出这个多项式,然而这显然是\(gg\)的 那么看看怎么优化,先来看一看拉格朗日插值 ...

  9. 【Luogu4781】【模板】拉格朗日插值

    [Luogu4781][模板]拉格朗日插值 题面 洛谷 题解 套个公式就好 #include<cstdio> #define ll long long #define MOD 998244 ...

随机推荐

  1. 在.net core程序中使用EntityFrameok(非EF Core)

    最近用NoSQL较多写,用传统的EF到不多,但在一些.net core小程序中也小试牛刀过,不过当时用的是微软为.net core量身定制的Entity Framework Core,只是一些比较常规 ...

  2. FCC---Animate Elements Continually Using an Infinite Animation Count---设置animation-iteration-count的次数为无限,让小球一直跳动

    The previous challenges covered how to use some of the animation properties and the @keyframes rule. ...

  3. cent OS 7 服务器 相关设置

    1. 不能联网, 很有可能是默认网络没有启动,需要手动启动 打开文件: vi /etc/sysconfig/network-scripts/ifcfg-ens33 如下: 如果是 no 改为 yes, ...

  4. 一文解读VR/AR/MR (转)

    1.VR=虚拟世界 VR,英文是Virtual Reality,中文是虚拟现实. VR眼镜 再细节一点来说,就是模拟一个三维的虚拟世界,在这个虚拟世界中,人们可以感受到视觉.听觉.触觉等方面的刺激. ...

  5. mySql创建带解释的表及给表和字段加注释的实现代码

    1.创建带解释的表 CREATE TABLE test_table( t_id INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '设置主键自增', t_name ...

  6. Linux(一)-- Linux环境搭建

    Linux环境搭建 一.虚拟机安装 1.下载地址 https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmwar ...

  7. 网络流媒体协议之——RTSP协议

    RTSP(Real-Time Stream Protocol)协议是一个基于文本的多媒体播放控制协议,属于应用层.RTSP以客户端方式工作,对流媒体提供播放.暂停.后退.前进等操作.该标准由IETF指 ...

  8. Eclipse修改JSP文件的默认编码

    Eclipse新建JSP文件,可以看到默认使用的是ISO-8859-1编码,如下图,而这种编码是无法保存中文的,不符合我们的需求 那么应该怎样修改呢?找到菜单Window-Preferences,找到 ...

  9. Python 修饰符@用法

    def funA(desA): print("It's funA") def funB(desB): print(desB( )) print("It's funB&qu ...

  10. 【PAT甲级】1008 Elevator (20分)

    1008 Elevator 题目: The highest building in our city has only one elevator. A request list is made up ...