hdu5322 Hope(dp+FFT+分治)

hdu

题目大意:n个数的排列,每个数向后面第一个大于它的点连边,排列的权值为每个联通块大小的平方,求所有排列的权值和。

思路:

考虑直接设dp[i]表示n=i时的答案。

我们考虑放完前n-1个数之后再插入n,会发现n前面所有数都和它联通。

于是dp方程就出来了:

$dp[n]=\Sigma(dp[n-k]*k^{2}*(k-1)!*C_{n-1}^{k-1})$

组合数倒腾过来变成:

$\frac{dp[n]}{(n-1)!}=\Sigma(\frac{dp[n-k]}{(n-k)!}*k^{2})$

分治FFT搞定。

 1 #include<cstdio>
2 #include<algorithm>
3 #include<cstring>
4 using namespace std;
5 typedef long long lint;
6 const lint mo=998244353;
7 const int N=600069;
8 lint fpow(lint a,lint p)
9 {
10 lint ret=1;
11 while(p)
12 {
13 if(p&1ll) (ret*=a)%=mo;
14 (a*=a)%=mo;
15 p>>=1;
16 }
17 return ret;
18 }
19 lint fac[N],ifac[N],i2[N];
20 lint dp[N];
21
22 int inv[N];
23 lint wg[N],iwg[N];
24 void ntt(lint *a,int len,int tp)
25 {
26 lint ilen=fpow(len,mo-2);
27 for(int i=0;i<len;i++) if(i<inv[i]) swap(a[i],a[inv[i]]);
28 for(int i=1;i<len;i<<=1)
29 {
30 lint w0=(~tp)?wg[i]:iwg[i];
31 for(int j=0;j<len;j+=(i<<1))
32 {
33 lint w=1;
34 for(int k=0;k<i;k++,(w*=w0)%=mo)
35 {
36 lint w1=a[j+k],w2=w*a[j+k+i]%mo;
37 a[j+k]=(w1+w2)%mo,a[j+k+i]=(w1-w2+mo)%mo;
38 }
39 }
40 }
41 if(tp==-1) for(int i=0;i<len;i++) (a[i]*=ilen)%=mo;
42 }
43 lint a[N],b[N],c[N];
44 void cdq(int l,int r)
45 {
46 if(l==r) {(dp[l]*=(l?fac[l-1]:1))%=mo;return;}
47 int mm=l+r>>1;
48 cdq(l,mm);
49 int len=1,pl=0,n=r-l+1;
50 while(len<=n) len<<=1,pl++;
51 for(int i=1;i<len;i++) inv[i]=(inv[i>>1]>>1)|((i&1)<<(pl-1));
52 for(int i=0;i<len;i++) a[i]=b[i]=0;
53 for(int i=0;i<mm-l+1;i++) a[i]=dp[i+l]*ifac[i+l]%mo;
54 for(int i=0;i<r-l+1;i++) b[i]=i2[i];
55 ntt(a,len,1),ntt(b,len,1);
56 for(int i=0;i<len;i++) c[i]=a[i]*b[i]%mo;
57 ntt(c,len,-1);
58 for(int i=mm+1;i<=r;i++) (dp[i]+=c[i-l])%=mo;
59 cdq(mm+1,r);
60 }
61
62
63 int xi,T;
64 int main()
65 {
66 fac[0]=ifac[0]=1;
67 for(int i=1;i<=100000;i++) fac[i]=fac[i-1]*i%mo,ifac[i]=fpow(fac[i],mo-2),i2[i]=1ll*i*i%mo;
68 for(int i=1;i<524288;i<<=1) wg[i]=fpow(3,(mo-1)/(i<<1)),iwg[i]=fpow(wg[i],mo-2);
69 dp[0]=1;
70 cdq(0,100000);
71 while(scanf("%d",&xi)!=EOF) printf("%lld\n",dp[xi]);
72 return 0;
73 }

hdu5322 Hope(dp+FFT+分治)的更多相关文章

  1. [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)

    [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...

  2. [BZOJ 4332] [JSOI2012]分零食(DP+FFT)

    [BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\ ...

  3. hdu5197 DZY Loves Orzing(FFT+分治)

    hdu5197 DZY Loves Orzing(FFT+分治) hdu 题目描述:一个n*n的矩阵里填入1~n^2的数,要求每一排从前往后能看到a[i]个数(类似于身高阻挡视线那种),求方案数. 思 ...

  4. bzoj 2244 [SDOI2011]拦截导弹(DP+CDQ分治+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2244 [题意] 给定n个二元组,求出最长不上升子序列和各颗导弹被拦截的概率. [思路] ...

  5. 【bzoj3672】[Noi2014]购票 斜率优化dp+CDQ分治+树的点分治

    题目描述  给出一棵以1为根的带边权有根树,对于每个根节点以外的点$v$,如果它与其某个祖先$a$的距离$d$不超过$l_v$,则可以花费$p_vd+q_v$的代价从$v$到$a$.问从每个点到1花费 ...

  6. 洛谷 P2634 聪聪可可 —— 树形DP / 点分治

    题目:https://www.luogu.org/problemnew/show/P2634 今天刚学了点分治,做例题: 好不容易A了,结果发现自己写的是树形DP...(也不用找重心)(比点分治快) ...

  7. HDU5322 Hope(DP + CDQ分治 + NTT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...

  8. HDU5730 Shell Necklace(DP + CDQ分治 + FFT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5730 Description Perhaps the sea‘s definition of ...

  9. 【XSY2666】排列问题 DP 容斥原理 分治FFT

    题目大意 有\(n\)种颜色的球,第\(i\)种有\(a_i\)个.设\(m=\sum a_i\).你要把这\(m\)个小球排成一排.有\(q\)个询问,每次给你一个\(x\),问你有多少种方案使得相 ...

随机推荐

  1. Java中Vo、Po等对象的解释

    PO:全称是 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. BO:全称是 busines ...

  2. python-logging日志模块,以及封装实现

    前言 是Python内置的标准模块,主要用于输出运行日志 基本语法 import logging # # logging模块默认设置的日志级别是warning,而debug和info的级别是低于war ...

  3. java宝典笔记(一)

    第四章java基础知识 4.1基本概念 一.java优点 1.面向对象(封装.继承.多态) 2.可移植性.平台无关,一次编译,到处运行.Windows,Linux,macos等.java为解释性语言, ...

  4. 从零开始,开发一个 Web Office 套件(5):Mouse hover over text

    <从零开始, 开发一个 Web Office 套件>系列博客目录 这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office ...

  5. IPC$管道的利用与远程控制

    实验目的 通过实验了解IPC$攻击的原理与方法. 实验原理 IPC$攻击的相关原理 IPC$(Internet Process Connection)是共享"命名管道"的资源,它是为了让进程间通信而开 ...

  6. 打印报表工具,web报表工具对比

    ​1.jasperreport报表 有批量报表打印功能,但一般需要通过专门的编程实现批量报表打印:一些较简单的分片式打印能通过主子表实现:不能自动适应纸张大小:不支持分栏打印:不支持一纸多页打印:不支 ...

  7. 计算机网络-IP篇

    目录 IP 基本认识 IP地址 IP 地址的分类 公有 IP 地址与私有 IP 地址 IP 地址与路由控制 IP 分⽚与重组 IPv6 基本认识 IPv4 ⾸部与 IPv6 ⾸部 IP协议 DNS A ...

  8. mapreduce类型对应

    public class OrderBean implements WritableComparable<OrderBean> { private Integer order_id; // ...

  9. Linux常用文件权限命令详解

    pwd pwd命令用于获取当前工作目录的绝对路径. 使用示例: pwd 效果如下图: cd cd命令用于切换工作目录. 使用示例: cd 万猫学社/ 效果如下图: 其中在路径表示时, 一个半角句号(. ...

  10. js websocket断线重连

    js websocket断开重连实例代码,请根据自己需求做出相应改动Vue中使用websocket $(function() { var lockReconnect = false;//避免重复连接 ...