正题

题目链接:https://www.luogu.com.cn/problem/P5437


题目大意

\(n\)个点的完全图,连接\(i,j\)的边权值为\((i+j)^k\)。随机选出一个生成树,求期望边权和。

\(1\leq n<998244353,1\leq k\leq 10^7\)


解题思路

一条边选出来的概率是\(\frac{2}{n}\)(总共有\(\frac{2}{n(n-1)}\)条,选\(n-1\)条,或者\(Prufer\)序列也能证明)

所以现在考虑怎么求

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

这个东西首先\(f(n)=\sum_{i=1}^n\sum_{j=1}^ni+j\)是一个二项式,所以\((i+j)^k\)就是一个\(k+2\)次多项式,所以可以考虑用拉插。

现在是如何快速求出\(1\sim k\)的值,考虑递推

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

然后用线性筛预处理出\(i^k\)就好了。当然拉插也要用线性的优化

时间复杂度\(O(n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e7+10,P=998244353;
ll n,k,cnt,pri[N/5],w[N<<1],y[N];
ll pre[N],suf[N],inv[N],ans;
bool v[N<<1];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
void Prime(int n){
w[1]=1;
for(ll i=2;i<=n;i++){
if(!v[i])pri[++cnt]=i,w[i]=power(i,k);
for(ll j=1;j<=cnt&&i*pri[j]<=n;j++){
v[i*pri[j]]=1;w[i*pri[j]]=w[i]*w[pri[j]]%P;
if(i%pri[j]==0)break;
}
}
return;
}
signed main()
{
scanf("%lld%lld",&n,&k);
Prime(k*2+6);k+=3;pre[0]=suf[k+1]=inv[1]=1;
y[2]=w[3];
for(ll i=3;i<=k;i++)
y[i]=(y[i-1]+w[i*2-1]+w[i*2-2]-w[i])%P;
for(ll i=1;i<=k;i++)y[i]=(y[i-1]+y[i])%P;
for(ll i=1;i<=k;i++)pre[i]=pre[i-1]*(n-i)%P;
for(ll i=k;i>=1;i--)suf[i]=suf[i+1]*(n-i)%P;
for(ll i=2;i<=k;i++)inv[i]=P-inv[P%i]*(P/i)%P;
inv[0]=1;
for(ll i=1;i<=k;i++)inv[i]=inv[i-1]*inv[i]%P;
for(ll i=1;i<=k;i++)
(ans+=pre[i-1]*suf[i+1]%P*inv[i-1]%P*inv[k-i]%P*y[i]%P*(((k-i)&1)?-1:1))%=P;
printf("%lld\n",(ans+P)%P*power(n,P-2)%P*2%P);
return 0;
}

P5437-[XR-2]约定【拉格朗日差值,数学期望】的更多相关文章

  1. [51nod]1229 序列求和 V2(数学+拉格朗日差值)

    题面 传送门 题解 这种颓柿子的题我可能死活做不出来-- 首先\(r=0\)--算了不说了,\(r=1\)就是个裸的自然数幂次和直接爱怎么搞怎么搞了,所以以下都假设\(r>1\) 设 \[s_p ...

  2. E - Guess the Root 拉格朗日差值法+交互

    题目传送门 题意:告诉你存在一个未知项系数最高为10的$f(x)$,你最多可以有50次询问,每次询问给出一个$x'$,系统会返回你$f(x')$的值,你需要猜一个$x''$,使得$f(x'')=0$, ...

  3. 奇妙的算法【10】TX--有效号码、最,小耗时、最小差值、差值输出、异或结果

    昨晚刚刚写的几道算法题,难度也还行,就是全部AC有些困难,当时第一题AC.第二题AC 60%,第四题AC 40%,第五题没有时间写完了,这个应该全部AC了:其中第三题没有写出来 1,是否存在符合规范的 ...

  4. JAVA中计算两个日期时间的差值竟然也有这么多门道

    上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...

  5. PHP中比较两个时间的大小与日期的差值

    在这里我们全用到时间戳 mktime(hour,minute,second,month,day,year,[is_dst])     其参数可以从右向左省略,任何省略的参数都会被设置成本地日期和时间的 ...

  6. 用Scala实现集合中相邻元素间的差值

    欢迎转载,转载请注明出处,徽沪一郎. 概要 代码这东西,不写肯定不行,新学Scala不久,将实际遇到的一些问题记录下来,日后也好查找. 今天讲的是如何计算同一集合中元素两两之间的差值,即求开始集合(a ...

  7. 输出有序数组的中两个元素差值为指定值diff的两个元素

    题目: 输出有序数组的中两个元素差值为指定值diff的两个元素. 思路: 这与输出两个元素的和的值为一定值类似,需要两个指针,不同的是:指针不是一左一右,而是一前一后. 如果差值等于diff,则返回: ...

  8. php 算法之切割数组,不用array_chunk(),算法之二,取数组的差值,不用array_diff()

    用php写算法切割数组,不用array_chunk();算法例如以下所看到的. <?php //$array 数组 //$size 每一个数组的个数 //每一个数组元素是否默认键值 functi ...

  9. 题目1096:日期差值(a-b=(a-c)-(b-c))

    http://ac.jobdu.com/problem.php?pid=1096 题目描述: 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天 输入: 有多组数据,每 ...

随机推荐

  1. 字符串匹配--Regex

    利用Regix实现字符串匹配 Eg:匹配嵌入到[]中的字符 string pattern = Regex.Escape("[") + "(.*?)]"; str ...

  2. js判断对象的某个属性是否存在

    参考:https://www.jb51.net/article/141994.htm 原始数据, [ {"name":"向阳镇","id": ...

  3. 关于腾讯云redis 无法外网访问的解决方案

    问题简介: 今天购买了一台腾讯云的redis:如图 可是我没有找到 腾讯云提供的外网地址,我该怎么连接呢?百度了一大堆 全部是 在腾讯云服务器上搭建的Redis实例的解决办法.完全不匹配. 开始解决: ...

  4. Ubuntu 16.04LTS安装flashplayer

    转载自http://www.linuxdiyf.com/linux/20084.html 在安装Ubuntu 16.04LTS后,播放有视频的网页时,总提示你要安装缺失的插件,在 ubuntu 系统下 ...

  5. promise例题

    let promise = new Promise(resolve => { console.log('Promise'); resolve(); }); promise.then(functi ...

  6. 证明:(a,[b,c]) = [(a,b),(a,c)]

    这题是潘承洞.潘承彪所著<初等数论>(第三版)第一章第5节里一个例题,书中采用算术基本定理证明,并指出要直接用第4节的方法来证是较困难的. 现采用第4节的方法(即最大公约数理论里的几个常用 ...

  7. Structs2的作用是什么??

    struts2是一种重量级的框架,位于MVC架构中的controller,可以分析出来,它是用于接受页面信息然后通过内部处理,将结果返回. 同时struts2也是一个web层的MVC框架,那么什么是s ...

  8. VS Code 搭建stm32开发环境

    MCU免费开发环境 一般芯片厂家会提供各种开发IDE方案,通常其中就包括其自家的集成IDE,如: 意法半导体 STM32CubeIDE NXP Codewarrior TI CCS 另外也可以用ecl ...

  9. 性能测试必备命令(1)- free

    性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 显示系统的内存使用情况 语 ...

  10. Gitlab(1)- 简单介绍

    什么是 Gitlab 一个开源分布式版本控制系统 开发语言:Ruby 功能:管理项目源代码.版本控制.代码复用与查找.权限管控 Git 家族成员 Git:是一种版本控制系统,是一个命令,是一种工具 G ...