题目

一个\(n\)个点的完全图,

第\(i\)个点到第\(j\)个点的边权是\((i+j)^k\),

现在把这个完全图变成一棵树,

求这棵树边权和的期望值

\((n\leq 10^{10000},k\leq 10^7,mod=998244353)\)


分析

因为\(n\)个结点的完全图的生成树个数为\(n^{n-2}\),

每条边在生成树中出现的次数是\(\frac{(n-1)n^{n-2}}{\frac{n(n-1)}{2}}=2n^{n-3}\)

所以应该

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

考虑差分

\[ans_n-ans_{n-1}=\sum_{i=n+1}^{2n-1}i^k
\]

对于单个正整数幂,因为它是积性函数,所以可以线性筛

后面这个东西脑补一下应该是一个\(k+2\)次多项式,

可以通过拉格朗日插值实现,因为这些值是连续的,所以可以\(O(k)\)实现

弱化版讲完了,由于\(n\)在模意义下可能为0,所以要特判

用\(998244353^2\)作新模数,如果最后\(n\)在模意义下不存在逆元,

可以证明答案是998244353的倍数,那么直接除掉就可以了

不过常数超级大,比多项式做法慢多了


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
typedef long long lll; typedef long double ld;
const lll mod=996491788296388609ll,N=2e7+11,rmod=998244353;
lll n,f[N],fac[N>>1],jc[N>>1],inv[N>>1]; int k,lim,Cnt,prime[1300001];
inline lll mol(lll a,lll b){
rr lll c=(ld)a*b/mod,ans=a*b-c*mod;
ans=ans<0?ans+mod:(ans>=mod?ans-mod:ans);
return ans;
}
inline lll mo1(lll x,lll y){return x+y>=mod?x+y-mod:x+y;}
inline lll mo2(lll x,lll y){return x<y?x-y+mod:x-y;}
inline lll ksm(lll x,lll y){
rr lll ans=1;
for (;y;y>>=1,x=mol(x,x))
if (y&1) ans=mol(ans,x);
return ans;
}
inline lll answ(){
jc[0]=jc[1]=fac[0]=1;
for (rr int i=2;i<=lim;++i) jc[i]=mol(jc[i-1],i);
rr lll prod=1,ans=0;
for (rr int i=1;i<=lim;++i){
prod=mol(prod,n-i);
inv[i]=fac[i]=mol(mol(jc[i-1],jc[lim-i]),n-i);
}
for (rr int i=1;i<=lim;++i) fac[i]=mol(fac[i],fac[i-1]);
fac[lim]=ksm(fac[lim],mod-2);
for (rr int i=lim;i;--i){
rr lll t=inv[i];
inv[i]=mol(fac[i-1],fac[i]),
fac[i-1]=mol(t,fac[i]);
}
for (rr int i=1;i<=lim;++i){
rr lll t=mol(mol(f[i],prod),inv[i]);
ans=mo1(ans,((lim^i)&1)?mod-t:t);
}
return ans;
}
inline signed rksm(int x,int y){
rr int ans=1;
for (;y;y>>=1,x=1ll*x*x%rmod)
if (y&1) ans=1ll*ans*x%rmod;
return ans;
}
signed main(){
rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) n=(n*10+c-48)%rmod,c=getchar();
scanf("%d",&k),f[1]=1,n=n<1?n+rmod:n,lim=(n<k+2?n+1:k+3)<<1;
for (rr int i=2;i<=lim;++i){
if (!f[i]) f[prime[++Cnt]=i]=ksm(i,k);
for (rr int j=1;j<=Cnt&&prime[j]<=lim/i;++j){
f[i*prime[j]]=mol(f[i],f[prime[j]]);
if (i%prime[j]==0) break;
}
}
for (rr int i=2;i<=lim;++i) f[i]=mo1(f[i],f[i-1]); lim>>=1;
for (rr int i=0;i<lim;++i) f[i+1]=mo1(f[i],mo2(f[i<<1|1],f[i+1]));
rr lll ans=n<=lim?f[n]:answ(); ans=mo1(ans,ans);
if (n%rmod) printf("%lld",ans%rmod*rksm(n,rmod-2)%rmod);
else printf("%lld",ans/rmod);
return 0;
}

#拉格朗日插值,线性筛#洛谷 5442 【XR-2】约定 (加强版)的更多相关文章

  1. 洛谷P1120 小木棍 [数据加强版](搜索)

    洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...

  2. 埃氏筛优化(速度堪比欧拉筛) + 洛谷 P3383 线性筛素数 题解

    我们一般写的埃氏筛消耗的时间都是欧拉筛的三倍,但是欧拉筛并不好想(对于我这种蒟蒻) 虽然 -- 我 -- 也可以背过模板,但是写个不会的欧拉筛不如写个简单易懂的埃氏筛 于是就有了优化 这个优化还是比较 ...

  3. Solution -「洛谷 P4449」于神之怒加强版

    \(\mathcal{Description}\)   Link.   给定 \(k\) 和 \(T\) 组 \(n,m\),对于每组,求 \[\sum_{i=1}^n\sum_{j=1}^m\ope ...

  4. 洛谷P2045 方格取数加强版(费用流)

    题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...

  5. 洛谷 P2045 方格取数加强版【费用流】

        题目链接:https://www.luogu.org/problemnew/show/P2045 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现 ...

  6. 洛谷P2812 校园网络[数据加强版] [Tarjan]

    题目传送门 校园网络 题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮 ...

  7. 洛谷P1368 均分纸牌(加强版)

    P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...

  8. 洛谷 P1120 小木棍[数据加强版]

    这道题可能是我做过的数据最不水的一道题-- 题目传送门 这题可以说是神剪枝,本身搜索并不算难,但剪枝是真不好想(好吧,我承认我看了题解)-- 剪枝: 用桶来存储木棍 在输入的时候记录下最长的木棍和最短 ...

  9. 洛谷 - P2045 - 方格取数加强版 - 费用流

    原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...

  10. 洛谷P2045 方格取数加强版 最小费用流

    Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...

随机推荐

  1. django中修改QueryDict数据类型和转成普通字典

    修改QueryDict的几种方式 简介 在正常的请求/响应周期中访问时,request.POST和request.GET上的QueryDict将是不可变的. 要获得可变版本,您需要使用QueryDic ...

  2. 【Azure 批处理 】Azure Batch门户中创建自定义作业模式失败解决办法

    问题描述 跟随官方文档,快速创建Azure批处理任务(快速入门:在 Azure 门户中运行第一个 Batch 作业),在添加作业时,选择"自定义模式",并添加文档中所提供的简单命令 ...

  3. 【Azure Developer】使用 Azure VM 上的用户分配托管标识访问 Azure Key Vault 中国区代码示例

    问题描述 在Global版本的Azure Key Vault 文档中,有一节介绍在Azure VM中使用标识获取访问令牌,调用Key Vault中的资源.但是在示例中,只有curl的命令执行,而没有代 ...

  4. 百亿节点、毫秒级延迟,携程金融基于 NebulaGraph 的大规模图应用实践

    作者:霖雾,携程数据开发工程师,关注图数据库等领域. 0. 背景 2017 年 9 月携程金融成立,在金融和风控业务中,有多种场景需要对图关系网络进行分析和实时查询,传统关系型数据库难以保证此类场景下 ...

  5. C++ 模板的笔记1

    C++模板的笔记1 C++ 函数模板 函数模板的定义 函数模板是一种可以生成不同类型函数的函数声明.函数模板的参数类型不是固定的,而是在调用时由实参类型推导出来. 语法: template <t ...

  6. 快速复习JDBC(超详细)

    第一章  JDBC概述 之前我们学习了JavaSE,编写了Java程序,数据保存在变量.数组.集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系: 后来我们学 ...

  7. 2FA双因素认证 - TOTP详解

    主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 在2FA双因素认证中,TOTP可谓是标准化程度最高的技术方案.它 ...

  8. Mysql数据库未添加索引引发的生产事故

    最近开发的新功能主要是首页的红点提示功能,某个用户登录系统app,然后进入某一个功能模块, 在该功能下面有很多地方可以操作,新功能就是根据用户信息查询当月是否存在新的数据.总共有四五 个地方如果出现增 ...

  9. iview 日期组件 清空后验证没报红,需要在onChange 进行单独 validateField,因为空字符串校验没有触发

    // 日期组件的 onChange this.yourObj.xxxTime = item this.$refs.yourForm.validateField('xxxTime')

  10. arch安装deep-wine-wechat时,跳过md5检测的方法

    yay -S --mflags --skipinteg deepin-wine-wechat 这条命令是的我们跳过了md5检测! 微信的安装位置:C:\Program Files\Tencent\We ...