其实有原题,生成树计数

然鹅这题里面是两道题, 50pts 可以用上面那题的做法直接过掉,另外 50pts 要推推式子,搞出 O n 的做法才行(毕竟多项式常数之大您是知道的)

虽说这道题里面是没有 a_i 的,也不用分治合并多项式的就是了,所以大致思路看我另一题的题解就好了,这里对于前 50pts 的做法只给出式子:

\[ANS_n= {(n-2)! \Big( [x^{n-2}] \big(\sum_{i=0}^\infty (i+1) ^m {x^i \over i! } \big)^n \Big)\over n^{n-2}}
\]

我们先康康我们原本要求的多项式变成了什么:

\[[x^{n-2}] \big(\sum_{i=0}^\infty (i+1) {x^i\over i!} \big)^n
\]

然后我们就考虑转成 EXP 咯

\[\begin{aligned} &[x^{n-2}]\Big(\sum_{i=0}^\infty (i+1) {x^i\over i!} \Big)^n\\=& [x^{n-2}]\Big(e^x(x+1)\Big)^n \\=&[x^{n-2}] e^{nx}·(x+1)^n \\=& \sum_{i=2}^{n} {n^{i-2}\over (i-2)!} ·{n!\over (n-i)!· i!} \end{aligned}
\]

注意,这里乱转 EXP 的时候千万要记得运算,不然就像我一样多加了一个 -x 然后死都化不出来了

然后咱预处理完 阶乘 及其 逆元 就可以 O n 出解了

//by Judge
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int mod=998244353;
const int iG=332748118;
const int M=5e6+3;
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int inc(int x,int y){return (x+=y)>=mod?x-mod:x;}
inline int dec(int x,int y){return (x-=y)<0?x+mod:x;}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline int read(){ int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} int n,m,res,limit; arr fac,finv,A,B,C,r;
inline int qpow(Rg int x,Rg int p=mod-2,int s=1){
for(;p;p>>=1,x=mul(x,x)) if(p&1) s=mul(s,x); return s;
}
inline void init(int n){ int l=-1;
for(limit=1;limit<n;limit<<=1)++l;
fp(i,0,limit-1) r[i]=(r[i>>1]>>1)|((i&1)<<l);
}
inline void NTT(int* a,int tp){
fp(i,0,limit-1) if(i<r[i]) swap(a[i],a[r[i]]);
for(Rg int mid=1;mid<limit;mid<<=1){
int Gn=qpow(tp?3:iG,(mod-1)/(mid<<1));
for(Rg int j=0,I=mid<<1,x,y;j<limit;j+=I)
for(Rg int k=0,g=1;k<mid;++k,g=mul(g,Gn))
x=a[j+k],y=mul(a[j+k+mid],g),
a[j+k]=(x+y)%mod,a[j+k+mid]=(x-y+mod)%mod;
} if(tp) return; int inv=qpow(limit);
fp(i,0,limit-1) a[i]=mul(a[i],inv);
}
void Inv(int* a,int* b,int n){ static arr C,D;
if(n==1) return b[0]=qpow(a[0]),void();
Inv(a,b,n>>1),init(n<<1);
fp(i,0,n-1) C[i]=a[i],D[i]=b[i];
fp(i,n,limit-1) C[i]=D[i]=0; NTT(C,1),NTT(D,1);
fp(i,0,limit-1) C[i]=mul(C[i],mul(D[i],D[i]));
NTT(C,0); fp(i,n,limit-1) b[i]=0;
fp(i,0,n-1) b[i]=dec(inc(b[i],b[i]),C[i]);
}
inline void Direv(int* a,int* b,int n){
fp(i,1,n-1) b[i-1]=mul(a[i],i); b[n-1]=0;
}
inline void Inter(int* a,int* b,int n){
fp(i,1,n-1) b[i]=mul(a[i-1],qpow(i)); b[0]=0;
}
void Ln(int* a,int* b,int n){ static arr C,D;
Inv(a,C,n),Direv(a,D,n),init(n<<1);
fp(i,n,limit-1) C[i]=D[i]=0; NTT(C,1),NTT(D,1);
fp(i,0,limit-1) C[i]=mul(C[i],D[i]); NTT(C,0),Inter(C,b,n);
}
void Exp(int* a,int* b,int n){
if(n==1) return b[0]=1,void(); static arr B;
Exp(a,b,n>>1),Ln(b,B,n),B[0]=dec(a[0]+1,B[0]); init(n<<1);
fp(i,1,n-1) B[i]=dec(a[i],B[i]); fp(i,n,limit-1) B[i]=0;
NTT(B,1),NTT(b,1); fp(i,0,limit-1) b[i]=mul(b[i],B[i]);
NTT(b,0); fp(i,n,limit-1) b[i]=B[i]=0;
}
int main(){
/// pre calc
n=2e6,fac[0]=finv[0]=finv[1]=1;
fp(i,1,n) fac[i]=mul(fac[i-1],i);
fp(i,2,n) finv[i]=mul(mod-mod/i,finv[mod%i]);
fp(i,2,n) finv[i]=mul(finv[i-1],finv[i]);
fp(Stp,1,read()){ n=read(),m=read();
Rg int len=1; while(len<=n) len<<=1;
if(m==1){
Rg int x=1,ans=0;
fp(i,2,n) ans=inc(ans,mul(x,mul(fac[n],mul(finv[i-2],mul(finv[n-i],finv[i]))))),x=mul(x,n);
printf("%d\n",mul(mul(fac[n-2],ans),qpow(qpow(n,n-2))));
} else{
fp(i,0,n) A[i]=mul(qpow(i+1,m),finv[i]); Ln(A,B,len);
fp(i,0,n) B[i]=mul(B[i],n),A[i]=0; Exp(B,A,len);
printf("%d\n",mul(mul(fac[n-2],A[n-2]),qpow(qpow(n,n-2))));
memset(A,0,(len+2)<<3);
}
} return 0;
}

codechef : TREDEG , Trees and Degrees的更多相关文章

  1. Codechef Dynamic Trees and Queries

    Home » Practice(Hard) » Dynamic Trees and Queries Problem Code: ANUDTQSubmit https://www.codechef.co ...

  2. Codechef December Challenge 2014 Chef and Apple Trees 水题

    Chef and Apple Trees Chef loves to prepare delicious dishes. This time, Chef has decided to prepare ...

  3. codechef FUN WITH TREES

    题目大意: 给一棵树root=1的树: 给一些操作:u  v 的路径所有节点的node + val: 最后m个询问:u 节点(包括u) sum%mod 是多少. LCA + RMQ: 我们每次mark ...

  4. 【CodeChef EDGEST】Edges in Spanning Trees(树链剖分+树上启发式合并)

    点此看题面 大致题意: 给你两棵\(n\)个点的树,对于第一棵树中的每条边\(e_1\),求存在多少条第二棵树中的边\(e_2\),使得第一棵树删掉\(e_1\)加上\(e_2\).第二棵树删掉\(e ...

  5. codechef营养题 第二弹

    第二弾が始まる! codechef problems 第二弹 一.Backup Functions 题面 One unavoidable problem with running a restaura ...

  6. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  7. hdu2848 Visible Trees (容斥原理)

    题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...

  8. [LeetCode] Minimum Height Trees 最小高度树

    For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...

  9. [LeetCode] Unique Binary Search Trees 独一无二的二叉搜索树

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

随机推荐

  1. cf 55D 数位dp 好题

    /* 刚开始我考虑0的情况,想将他剔除就将lcmn设为-1,这样还要判断0和lcmn是-1的情况很麻烦而且但是一直出错 后来觉得不用管0的情况就行了,可以认为符合. 解:将lcmn离散化,因为1-9的 ...

  2. 【BZOJ4710】分特产(容斥原理,组合计数)

    题意:有m种特产,第i种有a[i]个 有n个同学分特产,要求: 1.恰好分完 2.每个人至少要分到一个 求方案数模10^9+7 n,m,a[i]<=1000 思路:WYZ作业 首先考虑对于每一种 ...

  3. 【BZOJ3697】采药人的路径(点分治)

    题意:采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的.采药人每天都要进行采药活动.他选择的路径是很 ...

  4. 杜教筛--51nod1239 欧拉函数之和

    求$\sum_{i=1}^{n}\varphi (i)$,$n\leqslant 1e10$. 这里先把杜教筛的一般套路贴一下: 要求$S(n)=\sum_{i=1}^{n}f(i)$,而现在有一数论 ...

  5. MVC view页面需要多个model,复杂网页的处理

    需求描述 一个比较复杂的页面,界面中包含的元素数据来自于许多个有关联或者无关联的表,然后我们要做的就是将数据呈现在界面上. 10年前大概都是这么干的 直接写一个复杂的SQL语句,返回一个包含所需数据的 ...

  6. Word Search(深度搜索DFS,参考)

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  7. Java 添加、更新和移除PDF超链接

    简介 PDF超链接用一个简单的链接包含了大量的信息,满足了人们在不占用太多空间的情况下渲染外部信息的需求.下面将介绍通过Java 在PDF中添加.更新和移除超链接. (一)工具使用: Free Spi ...

  8. dataTables 添加行内操作按钮

    在上一篇博客中我们提到了用dataTables 做一个分页表格.今天进一步进阶,做一个行内带操作按钮的表格.效果如图. 记得最基础的实现方式是,我们要在js 中拼接字符串,嵌入一个带按钮的语句.但是现 ...

  9. muduo定时器、多线程模型及epoll的封装

    timerfd是Linux为用户程序提供的一个定时器接口,这个接口基于文件描述符. clock_gettime函数可以获取系统时钟,精确到纳秒.需要在编译时指定库:-lrt.可以获取两种类型时间: C ...

  10. Linux学习系列之memcached

    memcached简介 一.memcached是什么 memcached是一个开源的.支持高性能.高并发的分布式内存缓存系统 mem+cache+daemon:分布式内存缓存守护进程 memcache ...