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. Solution -「LOCAL」「cov. 牛客多校 2020 第三场 I」礼物

    \(\mathcal{Description}\)   给定排列 \(\{a_n\}\),求字典序第 \(K\) 大的合法排列 \(\{b_n\}\).称一个排列 \(\{p_n\}\) 合法,当且仅 ...

  2. 关于oracle中(+)的运用

    一.基础 1.1 SQL查询的基本原理 第一.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果.第二.两表 ...

  3. CobaltStrike逆向学习系列(13):RDI 任务执行流程分析

    这是[信安成长计划]的第 13 篇文章 0x00 目录 0x01 任务号 0x02 功能执行 0x03 结果接收 在上一篇文章中已经讲明了 RDI 类型的任务在发布时候的流程,接下来就是执行了,文中不 ...

  4. 能无缝嵌入Excel的报表工具,报表轻松做!

    现在很多人做数据分析会被推荐选择去用编程R和Python.PowerBI.Tableau.Qlik.Smartbi... 从目前数据分析的行业来说,Excel是世界上使用人数最多的报表分析工具,没有之 ...

  5. MySQL 学习笔记(二)MVCC 机制

    之前在讲 MySQL 事务隔离性提到过,对于写操作给读操作的影响这种情形下发生的脏读.不可重复读.虚读问题.是通过MVCC 机制来进行解决的,那么MVCC到底是如何实现的,其内部原理是怎样的呢?我们要 ...

  6. Java:IO流(二)——InputStream/OutputStream具体用法:FileXXXStream、ByteArrayXXXStream

    1.说明 InputStream和OutputStream是Java标准库中最基本的IO流,它们都位于java.io包中,该包提供了所有同步IO的功能. 2.模块:java.io.InputStrea ...

  7. SqlServer 取表某一列相同ID最大时的数据

    SELECT * FROM(SELECT *,ROW_NUMBER() OVER(PARTITION BY UserName ORDER BY Id DESC) Num FROM dbo.[User] ...

  8. hadoop分布式集群部署①

     Linux系统的安装和配置.(在VM虚拟机上) 一:安装虚拟机VMware Workstation 14 Pro 以上,虚拟机软件安装完成. 二:创建虚拟机. 三:安装CentOS系统 (1)上面步 ...

  9. 【FAQ】接入HMS Core推送服务过程中一些常见问题总结

    HMS Core 推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道.开发者通过集成推送服务,可以向客户端应用实时推送消息,构筑良好的用户关系,提升用户的感知度和活 ...

  10. 制作自己的rpm包,并为其制作patch包。

    本文分为两个部分,第一部分是制作一个简单的自己的rpm包,并安装运行它.第二部分是为其制作一个patch包,并通过spec配置文件去打补丁,安装.运行打补丁后的程序. 一.安装工具 [yh@local ...