hdu5322 Hope
设dp[n]为n个数字排列时候的答案,那么可以得到dp方程
dp[n]=Σdp[n-i]*c(n-1,i-1)*(i-1)!*i^2(1<=i<=n)
然后上式可以化成卷积形式,分治FFT即可。复杂度O(nlogn^2)
代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
const int P = *(<<)+;
const int N = << ;
const int G = ;
const int NUM = ; LL wn[NUM],cnt[N],jc[N],dp[N],dp2[N],inv[N];
LL a[N], b[N];
char A[N], B[N];
int len,i;
LL quick_mod(LL a, LL b, LL m)
{
LL ans = ;
a %= m;
while(b)
{
if(b & )
{
ans = ans * a % m;
b--;
}
b >>= ;
a = a * a % m;
}
return ans;
} void GetWn()
{
for(int i=; i<NUM; i++)
{
int t = << i;
wn[i] = quick_mod(G, (P - ) / t, P);
}
}
void Rader(LL a[], int len)
{
int j = len >> ;
for(int i=; i<len-; i++)
{
if(i < j) swap(a[i], a[j]);
int k = len >> ;
while(j >= k)
{
j -= k;
k >>= ;
}
if(j < k) j += k;
}
} void NTT(LL a[], int len, int on)
{
Rader(a, len);
int id = ;
for(int h = ; h <= len; h <<= )
{
id++;
for(int j = ; j < len; j += h)
{
LL w = ;
for(int k = j; k < j + h / ; k++)
{
LL u = a[k] % P;
LL t = w * (a[k + h / ] % P) % P;
a[k] = (u + t) % P;
a[k + h / ] = ((u - t) % P + P) % P;
w = w * wn[id] % P;
}
}
}
if(on == -)
{
for(int i = ; i < len / ; i++)
swap(a[i], a[len - i]);
LL Inv = quick_mod(len, P - , P);
for(int i = ; i < len; i++)
a[i] = a[i] % P * Inv % P;
}
}
void Conv(LL a[], LL b[], int n)
{
NTT(a, n, );
NTT(b, n, );
for(int i = ; i < n; i++)
a[i] = a[i] * b[i] % P;
NTT(a, n, -);
}
void solve(long long l,long long r)
{
int m,i;
if (l==r)
{
dp[l]=(dp[l]+jc[l-]*l%P*l%P)%P;
return;
}
m=(l+r)>>;
solve(l,m); len=;
while (len<=r-l+) len<<=;
for (i=l;i<=r;i++)
{
if (i<=m)
a[i-l]=dp[i]*inv[i]%P;
else
a[i-l]=; if (i<r)
b[i-l+]=inv[i-l]*jc[i-l]%P*(i-l+)%P*(i-l+)%P;
else
b[i-l+]=;
}
for (i=r-l+;i<=len;i++)
{
a[i]=;b[i]=;
}
b[]=; Conv(a,b,len); for (i=m+;i<=r;i++)
{
if (i->)
dp[i]=(dp[i]+a[i-l]*jc[i-])%P;
} solve(m+,r);
}
int main()
{
GetWn();
jc[]=;inv[]=;
for (i=;i<=;i++)
{
jc[i]=jc[i-]*i %P;
inv[i]=quick_mod(jc[i],P-,P);
}
solve(,);
int n;
while (scanf("%d",&n)==)
printf("%I64d\n",dp[n]);
}
hdu5322 Hope的更多相关文章
- hdu5322 Hope(dp+FFT+分治)
hdu5322 Hope(dp+FFT+分治) hdu 题目大意:n个数的排列,每个数向后面第一个大于它的点连边,排列的权值为每个联通块大小的平方,求所有排列的权值和. 思路: 考虑直接设dp[i]表 ...
- HDU5322 Hope(DP + CDQ分治 + NTT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...
- hdu5322 Hope(dp)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Hope Time Limit: 10000/5000 MS (Java/Othe ...
随机推荐
- Qt中sleep()的实现(耳目一新的两种方法)
在Qt中并没有Sleep函数可以调用,在程序编写时往往需要休眠几秒,这里举出两个方法,不知道是否啥不良隐患没~~ 方法一: class SleeperThread : public QThread{p ...
- sell -- 解码16进制unicode
1. //System.out.println("decodeUnicode:" + decodeUnicode("0049"));//I public sta ...
- 非常详细的docker学习笔记
http://www.open-open.com/lib/view/open1423703640748.html 一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化 ...
- C#反射代码
Object model=Assembly.Load(“程序集”).CreateInstance(命名空间.类名); object obj2 = Type.GetType("MyClass& ...
- OpenGl的glMatrixMode()函数理解
glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项 ...
- linux 入门
php php -v ------------------ 阿帕奇 apachectl -v httpd -v ----------------------------- mys ...
- window.open下载文件ie8请求的站点不可用的解决办法
在业务里用到了PHP header导出doc文档,GET传值到页面,读出相应数据输出doc文件下载.用户提出需要批量,于是设计成js循环出对应数量的window.open(),向页面传入不同的值,批量 ...
- jquery在线预览PDF文件,打开PDF文件(向下兼容ie8、ie7)
最主要的是使用到了一个jquery的插件jquery.media.js,使用这个插件就很容易实现了. 核心代码 <!DOCTYPE html PUBLIC "-//W3C//DTD X ...
- Activity的四种启动模式和onNewIntent()
转自:http://blog.csdn.net/linghu_java/article/details/17266603 Android中Activity启动模式详解 在Android中每个界面都 ...
- Android适配(屏幕适配、国际化适配)-转
首先来说一下Android的屏幕适配: 关于Android屏幕的一些基本概念知识,自行充电..在此只介绍实际开发过程中的使用 1.说到Android的屏幕适配,首当其冲的就是图片的适配 图片适配遵循两 ...