hdu5530
分治ntt
考虑从添加i,放在j位置,那么1->j是一个连通块,j+1->i和1->j不连通,那么我们可以列出式子dp[i]=∑j=1->i dp[i-j]*A(i-1,j-1)*j^2
dp[i]表示i个数的答案
然后化简一下就可以分治ntt了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5 + , P = ;
int n, k;
ll a[N], b[N], fac[N], inv[N], facinv[N], dp[N];
ll power(ll x, ll t)
{
ll ret = ;
for(; t; t >>= , x = x * x % P) if(t & ) ret = ret * x % P;
return ret;
}
void ntt(ll *a, int f)
{
for(int i = ; i < n; ++i)
{
int t = ;
for(int j = ; j < k; ++j) if(i >> j & ) t |= << (k - j - );
if(i < t) swap(a[i], a[t]);
}
for(int l = ; l <= n; l <<= )
{
ll w = power(, f == ? (P - ) / l : P - - (P - ) / l);
int m = l >> ;
for(int i = ; i < n; i += l)
{
ll t = ;
for(int k = ; k < m; ++k, t = t * w % P)
{
ll x = a[i + k], y = t * a[i + m + k];
a[i + k] = (x + y) % P;
a[i + m + k] = ((x - y) % P + P) % P;
}
}
}
if(f == -)
{
ll inv = power(n, P - );
for(int i = ; i < n; ++i) a[i] = a[i] * inv % P;
}
}
void cdq(int l, int r)
{
if(l == r) return;
int mid = (l + r) >> ;
cdq(l, mid);
n = ;
k = ;
while(n <= r - l + ) n <<= , ++k;
for(int i = ; i < n; ++i) a[i] = b[i] = ;
for(int i = l; i <= mid; ++i) a[i - l] = dp[i] * facinv[i] % P;
for(int i = ; i <= r - l; ++i) b[i] = (ll)i * i % P;
ntt(a, );
ntt(b, );
for(int i = ; i < n; ++i) a[i] = a[i] * b[i] % P;
ntt(a, -);
for(int i = mid + ; i <= r; ++i) dp[i] = (dp[i] + a[i - l] * fac[i - ] % P) % P;
cdq(mid + , r);
}
int main()
{
inv[] = inv[] = facinv[] = fac[] = ;
for(int i = ; i < N; ++i)
{
if(i != ) inv[i] = (P - P / i) * inv[P % i] % P;
facinv[i] = facinv[i - ] * inv[i] % P;
fac[i] = fac[i - ] * i % P;
}
dp[] = ;
cdq(, );
while(scanf("%d", &n) != EOF)
{ printf("%lld\n", dp[n]);
}
return ;
}
hdu5530的更多相关文章
随机推荐
- 服务管理-DHCP、NTP、SSH
DHCP协议的作用及原理 1.寻找server 当DHCP客户端第一次登陆网络的时候,也就是客户发现本机上没有任何ip资料设定,他会向网路发送一个dhcpdiscover封包.因为客户端还不知道自己属 ...
- java开发之随笔记录
1.java 保留两位小数 DecimalFormat df = new DecimalFormat("#.##"); System.out.println(df.format(1 ...
- 【iOS开发-79】利用Modal方式实现控制器之间的跳转
利用Modal方法.事实上就是以下两个方法的运用. Modal方式的切换效果是从底部呈现. -(void)clickModal{ WPViewController *wp=[[WPViewContro ...
- 如何清除本地DNS缓存 windows
在您的网站迁移服务器时需要对域名所指向的IP进行更改,这时候在本机访问网站时就需要清除本地的DNS缓存信息,那么怎样清除呢? 首先我们应该明白清除DNS缓存信息的原理:当计算机对域名访问时并不是每次访 ...
- 继续聊WPF——获取ComboBox中绑定的值
千万不要认为WPF中的数据绑定会很复杂,尽管它的确比Winform程序灵活多了,但其本质是不变的,特别是ComboBox控件,我们知道在Winform中对该控件的有两个专为数据绑定而设定的属性——Di ...
- Bullet Physics OpenGL 刚体应用程序模板 Rigid Simulation in Bullet
利用Bullet物理引擎实现刚体的自由落体模拟的模板 Bullet下载地址 Main.cpp #include <GLUT/glut.h> #include <cstdlib> ...
- Hibernate的检索策略和优化
一.检索策略概述 当我们实现了一对多或者多对多的映射后,在检索数据库时需要注意两个问题: 1.使用尽可能小的内存:当 Hibernate 从数据库中加载一个客户信息时, 如果同时加载所有关联这个客户的 ...
- xorm
https://github.com/go-xorm/xorm Simple and Powerful ORM for Go, support mysql,postgres,tidb,sqlite3, ...
- non-blocking I/O
https://en.wikipedia.org/wiki/New_I/O_(Java) zh.wikipedia.org/wiki/Java_NIO Java NIO API提供在java.nio套 ...
- finding friends with mapreduce
http://stevekrenzel.com/finding-friends-with-mapreduce