Description

“简单无向图”是指无重边、无自环的无向图(不一定连通)。

一个带标号的图的价值定义为每个点度数的k次方的和。

给定n和k,请计算所有n个点的带标号的简单无向图的价值之和。

因为答案很大,请对998244353取模输出。

Input

第一行包含两个正整数n,k(1<=n<=10^9,1<=k<=200000)。

Output

输出一行一个整数,即答案对998244353取模的结果。

Sample Input

6 5

Sample Output

67584000

Sol

首先我们发现,图中每个点的贡献是独立的,而且每个点都一样,所以我们只计算1号点的贡献,之后乘n即可。除了1号点,其他的点可以任意连边,而1号点的出边有n-1条,我们可以枚举选择几条,于是有:

\(ans=n*2^{\frac{(n-1)(n-2)}{2}}*\sum_{i=0}^{n-1}C_n^i*i^k\)

前面一部分显然能够直接算,然后我们把n--,考虑后面一部分:

有这样一个定理:\(n^k=\sum_{i=1}^{n}A_n^iS_k^i\),证明的话,可以用组合意义证明,就是考虑把k个球放到n个带标号的箱子的方案数,显然两边都可以描述这样的方案数。

所以\(\sum_{i=0}^{n}C_n^i*i^k=\sum_{i=0}^{n}C_n^i*\sum_{j=0}^{i}A_i^jS_k^j\)

\(=\sum_{i=0}^{n}C_n^i*\sum_{j=0}^iC^j_ij!S_k^j\)

\(=\sum_{j=0}^{n}j!S_k^j\sum_{i=0}^nC_n^iC_i^j\)

这里因为组合数的限制,我们可以把求和上限取到n,不会影响答案,但是这样便于进一步的推导。

后面那个式子等同于\(C_n^j*2^{n-j}\),因为从n个中选i个,再从i中选j个,而且i是从1~n循环的,这等同于我们直接枚举j,然后剩下的随意选与不选的方案数,也就是上面的式子了。

这样原式\(=\sum_{j=0}^nj!S_k^jC_n^j*2^{n-j}\)

斯特林数因为下底固定,所以可以用NTT计算,然后这个题就能在\(O(nlogn)\)时间内解决。

要注意\(C_n^j\)因为下底过大无法预处理,所以只能按步根据定义式计算。

Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,fac[200005],ifa[200005],inv[200005],a[524289],b[524289],C=1,P=998244353,w,wn,t,ans;int K,len,i,j,k;
ll ksm(ll a,ll b){ll res=1;for(;b;b>>=1,a=a*a%P) if(b&1) res=res*a%P;return res;}
void ntt(ll *a,int n,int op)
{
for(i=k=0;i<n;i++){if(i>k) swap(a[i],a[k]);for(j=(n>>1);(k^=j)<j;j>>=1);}
for(k=2,wn=ksm(3,op==1?(P-1)/k:P-1-(P-1)/k);k<=n;k<<=1,wn=ksm(3,op==1?(P-1)/k:P-1-(P-1)/k))
for(i=0,w=1;i<n;i+=k,w=1) for(j=0;j<(k>>1);j++,w=w*wn%P)
t=a[i+j+(k>>1)]*w%P,a[i+j+(k>>1)]=(a[i+j]-t+P)%P,a[i+j]=(a[i+j]+t)%P;
if(op==-1) for(t=ksm(n,P-2),i=0;i<n;i++) a[i]=a[i]*t%P;
}
int main()
{
scanf("%lld%d",&n,&K);n--;
for(len=1;len<=(K*2);len<<=1);
inv[0]=inv[1]=fac[0]=fac[1]=ifa[0]=ifa[1]=1;
for(int i=2;i<=K;i++) inv[i]=P-(P/i)*inv[P%i]%P,fac[i]=fac[i-1]*i%P,ifa[i]=inv[i]*ifa[i-1]%P;
for(int i=0;i<=K;i++) a[i]=(i&1?-1:1)*ifa[i],b[i]=ksm(i,K)*ifa[i]%P;
ntt(a,len,1);ntt(b,len,1);
for(int i=0;i<len;i++) a[i]=a[i]*b[i]%P;ntt(a,len,-1);
for(int i=0;i<=n&&i<=K;i++) ans=(ans+a[i]*fac[i]%P*C%P*ksm(2,n-i)%P)%P,C=C*(n-i)%P*inv[i+1]%P;
ans=ans*(n+1)%P*ksm(2,n*(n-1)/2)%P;printf("%lld\n",(ans+P)%P);
}

【bzoj5093】 [Lydsy1711月赛]图的价值 组合数+斯特林数+NTT的更多相关文章

  1. BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】

    题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...

  2. bzoj5093: [Lydsy1711月赛]图的价值

    不难想到考虑每个点的贡献,ans=n*sigema(1~n)i C(n-1,i)*(2^C(n-1,2))*i^k 直接套第二类斯特林拆柿子即可.提示:sigema(1~n)i C(n,i)*C(i, ...

  3. bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数

    [Lydsy1711月赛]图的价值 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 245  Solved: 128[Submit][Status][D ...

  4. 【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)

    题意: 给定\(n\)个点,一个图的价值定义为所有点的度数的\(k\)次方之和. 现在计算所有\(n\)个点的简单无向图的价值之和. 思路: 将式子列出来: \[ \sum_{i=1}^n\sum_{ ...

  5. bzoj5093:[Lydsy1711月赛]图的价值

    题目 首先考虑到这是一张有标号的图,每一个点的地位是相等的,因此我们只需要求出一个点的价值和乘上\(n\)就好了 考虑一个点有多少种情况下度数为\(i\) 显然我们可以让除了这个点的剩下的\(n-1\ ...

  6. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT

    定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...

  7. bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...

  8. BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)

    题目链接 对于单独一个点,我们枚举它的度数(有多少条边)来计算它的贡献:\[\sum_{i=0}^{n-1}i^kC_{n-1}^i2^{\frac{(n-2)(n-1)}{2}}\] 每个点是一样的 ...

  9. BZOJ 5093: [Lydsy1711月赛]图的价值

    第二类斯特林数模版题 需要一些组合数的小$ trick$ upd:这里更新了本题巧妙的$ O(k)$做法,虽然常数很大就是了 传送门:here 题意:求所有$ n$个节点的无重边自环图的价值和,定义一 ...

随机推荐

  1. Ceph recover的速度控制

    前言 磁盘损坏对于一个大集群来说,可以说是必然发生的事情,即使再小的概率,磁盘量上去,总会坏那么几块盘,这个时候就会触发内部的修复过程,修复就是让不满足副本要求的PG,恢复到满足的情况 一般是踢掉坏盘 ...

  2. 使用 Ansible 管理 MySQL 复制

    Ansible 是一个新兴的 IT 自动化工具.本文将介绍如何通过 Ansible 配置及管理 MySQL 主.从复制环境,实现部署过程自动化,体验 Ansible 简单快速带来的快感. 简介: An ...

  3. DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...

  4. leetcode884

    class Solution { public: void SplitString(const string& s, vector<string>& v, const st ...

  5. 有关DNS

    单位的域控制器和下面客户端的连接一直有问题,时常会找不到服务器连接: 错误基本显示为:没有可以登录的服务器 无法连接seed.com域 后来发现,是DNS解析的问题,单位使用了外部解析地址202.96 ...

  6. java Integer类的缓存(转)

    首先看一段代码(使用JDK 5),如下: public class Hello { public static void main(String[] args) { int a = 1000, b = ...

  7. saltstack系列(五)——zmq扩展(一)

    问题 假设我们的一个客户端既有pull又有sub,他们两个都需要接收消息,该如何协调呢,毕竟,当一个socket要收消息的时候,函数recv是阻塞的,所以,我们第一个思路是不让它阻塞? 实例代码: # ...

  8. java tcp socket实例

    java tcp socket实例 2011-04-20 13:58 2364人阅读 评论(1) 收藏 举报 socketjavatcpthreadserverclass package com.ne ...

  9. 7. Reverse Integer 反转整数

    [抄题]: 将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数).   样例 给定 x = 123,返回 321 给定 x = -123,返回 -321 [暴力解法]: ...

  10. 数字图像处理实验(13):PROJECT 05-04,Parametric Wiener Filter 标签: 图像处理MATLAB 2017-05-27 10:59

    实验要求: Objective: To understand the high performance of the parametric Wiener Filter in image restora ...