其实有原题,生成树计数

然鹅这题里面是两道题, 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. DP 简单题目练习

    ZOJ 1234 这道题目我表示也还不是特别能理解....还是太菜了T T 从后往前思考,因为只要后面有多的数在,那么C肯定是存在的,只要考虑是否把前两个数加在一起作为badness值这样两种情况来考 ...

  2. [luoguP1877] [HAOI2012]音量调节(DP)

    传送门 绝世傻DP #include <cstdio> #include <iostream> #define N 51 int n, s, mx; bool f[N][100 ...

  3. 【NOIP2017练习&BZOJ4998】星球联盟(强联通分量,并查集)

    题意: 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两个 ...

  4. c++ stl 使用汇总(string,vector,map,set)

    1.string 1>substr(),截取字串的方法.返回一个从指定位置开始,并具有指定长度的子字符串.参数 start(必选),所需的子字符串的起始位置.字符串中第一个字符的索引为 0.le ...

  5. spring mvc 访问静态资源404

    访问比如css js出现404提示 在spring的配置文件中加上如下代码即可 <!-- 静态资源404 --> <mvc:resources location="/res ...

  6. Java正则表达式过滤出字母、数字和中文

    原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A ...

  7. symfony 参考

    多语言存数据库 http://blog.elendev.com/development/php/symfony/use-a-database-as-translation-provider-in-sy ...

  8. ViewFlipper实现ViewPager的页面切换效果

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  9. Linux学习系列之lvs+keepalived

    LVS简介 LVS介绍 LVS是Linux Virtual Server的缩写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,属于4层负载均衡 ipvs和ipvsadm的关系 我们使用配置LV ...

  10. Storm计算结果是怎样存放的

    Storm计算的结果存放在哪里? 刚開始接触Storm的时候.往往都会有这么一个疑问:"Storm处理后 的计算结果是保存在哪里呢?"是内存中还是在其他的地方? 官方给出的解释是: ...