HDU 5322 Hope (分治NTT优化DP)
题目大意:
假设现在有一个排列,每个数和在它右面第一个比它大的数连一条无向边,会形成很多联通块。
定义一个联通块的权值为:联通块内元素数量的平方。
定义一个排列的权值为:每个联通块的权值之积
求长度为$n$所有排列的权值之和,$n\leq 1e5$,$1e4$组询问
原题面描述不清楚啊..害得我白想了30min
和ZOJ3874一样都是排列$DP$问题
$DP$方程还是不难想的
假设现在有一个$i-1$的排列,当我们把$i$某个位置上时
$i$前面的数都会和$i$连通,$i$后面的数一定不和$i$前面的数连通
利用这个性质就可以$DP$了,定义$f[i]$表示长度为$i$的所有排列的权值之和
$f[i]$
$i$后面一共j个数可以在$i-1$个数中任选,$i$前面一共$i-j-1$个数可以任意排列,可得
$=\sum C_{i-1}^{j}f[j](i-j-1)!(i-j)^{2}$
化简
$=(i-1)!\sum \frac{f[j]}{j!}(i-j)^{2}$
发现这是一个卷积的形式,用分治$NTT$解决即可
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 (1<<18)+10
#define il inline
#define dd double
#define ld long double
#define ll long long
using namespace std; const int inf=0x3f3f3f3f;
const ll p=;
int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
ll qpow(ll x,ll y)
{
ll ans=;
for(;y;x=x*x%p,y>>=) if(y&) ans=ans*x%p;
return ans;
} namespace NTT{ ll a[N1],b[N1],c[N1],Wn[N1],_Wn[N1];
int r[][N1];
void Pre(int len,int L)
{
int i,j;
for(j=;j<=L;j++) for(i=;i<(<<j);i++)
r[j][i]=(r[j][i>>]>>)|((i&)<<(j-));
for(i=;i<=len;i<<=) Wn[i]=qpow(,(p-)/i), _Wn[i]=qpow(Wn[i],p-);
}
void NTT(ll *s,int len,int type,int L)
{
int i,j,k; ll wn,w,t;
for(i=;i<len;i++) if(i<r[L][i]) swap(s[i],s[r[L][i]]);
for(k=;k<=len;k<<=)
{
wn=(type>)?Wn[k]:_Wn[k];
for(i=;i<len;i+=k)
{
for(j=,w=;j<(k>>);j++,w=w*wn%p)
{
t=w*s[i+j+(k>>)]%p;
s[i+j+(k>>)]=(s[i+j]+p-t)%p;
s[i+j]=(s[i+j]+t)%p;
}
}
}
}
void Main(int len,int L)
{
int i,invl=qpow(len,p-);
NTT(a,len,,L); NTT(b,len,,L);
for(i=;i<len;i++) c[i]=a[i]*b[i]%p;
NTT(c,len,-,L);
for(i=;i<len;i++) c[i]=c[i]*invl%p;
}
void clr(int sz)
{
memset(a,,sz<<);
memset(b,,sz<<);
} }; using NTT::a; using NTT::b; using NTT::c;
ll f[N1],g[N1],ans[N1],mul[N1],_mul[N1]; int de;
void CDQ(int l,int r)
{
if(r-l==&&l>)
{
ans[l]=mul[l-]*f[l]%p;
f[l]=ans[l]*_mul[l]%p; return;
}
if(r-l<=) return;
int mid=(l+r)>>,i,len,L;
CDQ(l,mid);
for(len=,L=;len<(mid-l)+(r-l)-;len<<=,L++);
for(i=l;i<mid;i++) NTT::a[i-l]=f[i];
for(i=;i<(r-l);i++) NTT::b[i]=g[i];
NTT::Main(len,L);
for(i=mid;i<r;i++) f[i]=(f[i]+NTT::c[i-l])%p;
NTT::clr(len);
CDQ(mid,r);
}
int T,n,m;
int que[N1]; int main()
{
int i,j,x,y,len,L;
n=;
for(i=;i<n;i++) g[i]=1ll*i*i%p;
mul[]=mul[]=_mul[]=_mul[]=;
for(i=;i<n;i++) mul[i]=mul[i-]*i%p, _mul[i]=qpow(mul[i],p-);
for(len=,L=;len<n+n-;len<<=,L++);
NTT::Pre(len,L);
f[]=; CDQ(,n);
while(scanf("%d",&n)!=EOF)
printf("%lld\n",ans[n]);
return ; }
HDU 5322 Hope (分治NTT优化DP)的更多相关文章
- ZOJ 3874 Permutation Graph (分治NTT优化DP)
题面:vjudge传送门 ZOJ传送门 题目大意:给你一个排列,如果两个数构成了逆序对,就在他们之间连一条无向边,这样很多数会构成一个联通块.现在给出联通块内点的编号,求所有可能的排列数 推来推去容易 ...
- HDU 5279 YJC plays Minecraft (分治NTT优化DP)
题目传送门 题目大意:有$n$个小岛,每个小岛上有$a_{i}$个城市,同一个小岛上的城市互相连接形成一个完全图,第$i$个小岛的第$a_{i}$个城市和第$i+1$个小岛的第$1$个城市连接,特别地 ...
- 【uoj#244】[UER #7]短路 CDQ分治+斜率优化dp
题目描述 给出 $(2n+1)\times (2n+1)$ 个点,点 $(i,j)$ 的权值为 $a[max(|i-n-1|,|j-n-1|)]$ ,找一条从 $(1,1)$ 走到 $(2n+1,2n ...
- BZOJ1492:[NOI2007]货币兑换 (CDQ分治+斜率优化DP | splay动态维护凸包)
BZOJ1492:[NOI2007]货币兑换 题目传送门 [问题描述] 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和B纪念券(以下简称B券).每个持有金券的 ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- hdu 2829 Lawrence(四边形不等式优化dp)
T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...
- hdu 3507 Print Article(斜率优化DP)
题目链接:hdu 3507 Print Article 题意: 每个字有一个值,现在让你分成k段打印,每段打印需要消耗的值用那个公式计算,现在让你求最小值 题解: 设dp[i]表示前i个字符需要消耗的 ...
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- 2018 CCPC网络赛 1010 hdu 6447 ( 树状数组优化dp)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 思路:很容易推得dp转移公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j ...
随机推荐
- 公告:CSDN博客积分系统升级(暂行版)
各位亲爱的用户: CSDN博客频道将于2014年10月22日23点至10月23日8点进行积分系统的升级,升级期间会影响大家的正常訪问和操作.给大家带来不便.敬请广大用户谅解.很多其它详情见>&g ...
- php抓取网页
用php抓取页面的内容在实际的开发其中是很实用的,如作一个简单的内容採集器,提取网页中的部分内容等等.抓取到的内容在通过正則表達式做一下过滤就得到了你想要的内容.下面就是几种经常使用的用php抓取网页 ...
- 关联查询之map的延伸使用方法
<select id="front.sort.selectListall" parameterType="myshop.services.front.sort.be ...
- VIM中括号的自动补全与删除
先放来源 http://oldj.net/article/vim-parenthesis/ 很多现代 IDE 都有自动补全配对括号的功能,比如输入了左括号“(”,IDE 就自动在后面添加一个对应的右括 ...
- [ASPX] DotLiquid-Asp.net模板引擎
以前用过一段时间的PHP,感觉非常不错,其中最让我难忘的就是Smarty模板引擎,当时就微微地想Asp.net里有没有像这样的模板引擎呢?不过由于之后的工作内容都用不到,或者说没有想到用模板,这想法也 ...
- 爬虫—分析Ajax爬取今日头条图片
以今日头条为例分析Ajax请求抓取网页数据.本次抓取今日头条的街拍关键字对应的图片,并保存到本地 一,分析 打开今日头条主页,在搜索框中输入街拍二字,打开开发者工具,发现浏览器显示的数据不在其源码里面 ...
- css网页布局方式的理解
一,标准流(默认状态,元素盒按照文档中出现的顺序排列) 块级元素--垂直排版 display:block; 单独一行,可以设置宽高,宽度默认和父元素宽度一致 一般结构性标记都为块级元素,如div,h, ...
- USB接口大全
USB2.0系列: Standard A: Standard B: Mini Standard B: Micro USB: ** Micro USB 与 Mini B比较 ** USB3.0系列: U ...
- [OpenWrt]安装mjpg-streamer
安装mjpg-streamer 远程监控基本上是wifi小车的一个必备功能了.摄像头我用的是奥尼百脑通 D881,这个要100左右. 确认安装了以下软件: kmod-usb2 kmod-video-u ...
- hdu 2768 Cat vs. Dog 最大独立集 巧妙的建图
题目分析: 一个人要不是爱狗讨厌猫的人,要不就是爱猫讨厌狗的人.一个人喜欢的动物如果离开,那么他也将离开.问最多留下多少人. 思路: 爱猫和爱狗的人是两个独立的集合.若两个人喜欢和讨厌的动物是一样的, ...