其实有原题,生成树计数

然鹅这题里面是两道题, 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 出解了

  1. //by Judge
  2. #pragma GCC optimize("Ofast")
  3. #include<bits/stdc++.h>
  4. #define Rg register
  5. #define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
  6. #define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
  7. #define ll long long
  8. using namespace std;
  9. const int mod=998244353;
  10. const int iG=332748118;
  11. const int M=5e6+3;
  12. typedef int arr[M];
  13. #ifndef Judge
  14. #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
  15. #endif
  16. char buf[1<<21],*p1=buf,*p2=buf;
  17. inline int inc(int x,int y){return (x+=y)>=mod?x-mod:x;}
  18. inline int dec(int x,int y){return (x-=y)<0?x+mod:x;}
  19. inline int mul(int x,int y){return 1ll*x*y%mod;}
  20. inline int read(){ int x=0,f=1; char c=getchar();
  21. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  22. for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
  23. } int n,m,res,limit; arr fac,finv,A,B,C,r;
  24. inline int qpow(Rg int x,Rg int p=mod-2,int s=1){
  25. for(;p;p>>=1,x=mul(x,x)) if(p&1) s=mul(s,x); return s;
  26. }
  27. inline void init(int n){ int l=-1;
  28. for(limit=1;limit<n;limit<<=1)++l;
  29. fp(i,0,limit-1) r[i]=(r[i>>1]>>1)|((i&1)<<l);
  30. }
  31. inline void NTT(int* a,int tp){
  32. fp(i,0,limit-1) if(i<r[i]) swap(a[i],a[r[i]]);
  33. for(Rg int mid=1;mid<limit;mid<<=1){
  34. int Gn=qpow(tp?3:iG,(mod-1)/(mid<<1));
  35. for(Rg int j=0,I=mid<<1,x,y;j<limit;j+=I)
  36. for(Rg int k=0,g=1;k<mid;++k,g=mul(g,Gn))
  37. x=a[j+k],y=mul(a[j+k+mid],g),
  38. a[j+k]=(x+y)%mod,a[j+k+mid]=(x-y+mod)%mod;
  39. } if(tp) return; int inv=qpow(limit);
  40. fp(i,0,limit-1) a[i]=mul(a[i],inv);
  41. }
  42. void Inv(int* a,int* b,int n){ static arr C,D;
  43. if(n==1) return b[0]=qpow(a[0]),void();
  44. Inv(a,b,n>>1),init(n<<1);
  45. fp(i,0,n-1) C[i]=a[i],D[i]=b[i];
  46. fp(i,n,limit-1) C[i]=D[i]=0; NTT(C,1),NTT(D,1);
  47. fp(i,0,limit-1) C[i]=mul(C[i],mul(D[i],D[i]));
  48. NTT(C,0); fp(i,n,limit-1) b[i]=0;
  49. fp(i,0,n-1) b[i]=dec(inc(b[i],b[i]),C[i]);
  50. }
  51. inline void Direv(int* a,int* b,int n){
  52. fp(i,1,n-1) b[i-1]=mul(a[i],i); b[n-1]=0;
  53. }
  54. inline void Inter(int* a,int* b,int n){
  55. fp(i,1,n-1) b[i]=mul(a[i-1],qpow(i)); b[0]=0;
  56. }
  57. void Ln(int* a,int* b,int n){ static arr C,D;
  58. Inv(a,C,n),Direv(a,D,n),init(n<<1);
  59. fp(i,n,limit-1) C[i]=D[i]=0; NTT(C,1),NTT(D,1);
  60. fp(i,0,limit-1) C[i]=mul(C[i],D[i]); NTT(C,0),Inter(C,b,n);
  61. }
  62. void Exp(int* a,int* b,int n){
  63. if(n==1) return b[0]=1,void(); static arr B;
  64. Exp(a,b,n>>1),Ln(b,B,n),B[0]=dec(a[0]+1,B[0]); init(n<<1);
  65. fp(i,1,n-1) B[i]=dec(a[i],B[i]); fp(i,n,limit-1) B[i]=0;
  66. NTT(B,1),NTT(b,1); fp(i,0,limit-1) b[i]=mul(b[i],B[i]);
  67. NTT(b,0); fp(i,n,limit-1) b[i]=B[i]=0;
  68. }
  69. int main(){
  70. /// pre calc
  71. n=2e6,fac[0]=finv[0]=finv[1]=1;
  72. fp(i,1,n) fac[i]=mul(fac[i-1],i);
  73. fp(i,2,n) finv[i]=mul(mod-mod/i,finv[mod%i]);
  74. fp(i,2,n) finv[i]=mul(finv[i-1],finv[i]);
  75. fp(Stp,1,read()){ n=read(),m=read();
  76. Rg int len=1; while(len<=n) len<<=1;
  77. if(m==1){
  78. Rg int x=1,ans=0;
  79. 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);
  80. printf("%d\n",mul(mul(fac[n-2],ans),qpow(qpow(n,n-2))));
  81. } else{
  82. fp(i,0,n) A[i]=mul(qpow(i+1,m),finv[i]); Ln(A,B,len);
  83. fp(i,0,n) B[i]=mul(B[i],n),A[i]=0; Exp(B,A,len);
  84. printf("%d\n",mul(mul(fac[n-2],A[n-2]),qpow(qpow(n,n-2))));
  85. memset(A,0,(len+2)<<3);
  86. }
  87. } return 0;
  88. }

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. wangEditor

    wangEditor 基于javascript和css开发的 Web富文本编辑器, 轻量.简洁.易用.开源免费 http://www.wangeditor.com/index.html API htt ...

  2. hdu 4771好题

    #include<stdio.h> #include<string.h>//通过只记录每一步此时点的状态.题非常好 #include<queue> using na ...

  3. Python模块:configparser、hashlib、(subprocess)

    configparser模块: 此模块用于生成和修改常见配置文档. 一个常见配置文件(.ini的后缀名)格式如下: [DEFAULT] # DEFAULT 是指后面的字典里都会默认有的内容 Serve ...

  4. 2018/2/16 解析Logback的AppenderBase源码,并举一反三的实现Logback扩展功能的思路,以及它的实际业务应用场景

    在学习Logback的过程中,知道了它有一个可以将日志往第三方数据源写的功能,这个功能的实现就是这个AppenderBase类,不禁想看看它的源码. 下面是AppenderBase类的所有子类(也就是 ...

  5. Linux中kill,pkill,killall和xkill命令汇总讲解

    终止一个进程或终止一个正在运行的程式,一般是通过 kill .killall.pkill.xkill 等进行.比如一个程式已死掉,但又不能退出,这时就应该考虑应用这些工具. 另 外应用的场合就是在服务 ...

  6. 2017 CCPC 杭州 HDU6273J 区间修改(线段树&差分数组)

    http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf 解析 线段树区间延迟更新 或 差分数组 两个数   统计2和3的最少的 ...

  7. GNS3模拟的硬件

    Hardware emulated by GNS3 Cisco 1700 Series 1700s have one or more interfaces on the motherboard, 2 ...

  8. 对一个deb包的解压、改动、又一次打包全过程方法

    /*********************************************************************  * Author  : Samson  * Date   ...

  9. C#.NET 如何打开高版本的sln文件

    我用VS2008去打开2010版本的解决方案,提示如下   其实我可以直接打开这个csproj文件并运行   关闭之后就会提示是否创建一个新的 sln文件

  10. Django打造大型企业官网(六)

    4.9.根据轮播图个数修改小圆点数量 src/js/index.js function Banner() { this.bannerWidth = 798; } Banner.prototype.in ...