ntt+cdq分治

原来zwh出的cf是斯特林

第二类斯特林数的定义是S(i,j)表示将i个物品分到j个无序集合的方案数,那么这道题中S(i,j)*j!*2^j是指将i个物品分到j个有序集合中并且每个集合可以选或不选的方案数,那么我们改变这个公式,得出

F[i]=∑F[j]*2*C(i,j),j=0-n,意思是第一个集合选n-j个的方案数,那么这个集合有两种情况选或不选,乘上2,再乘上选出元素的方案数。然后展开组合数,得出F[i]=∑F[j]*2*i!/(i-j)!/j!,移项得出F[i]/i!=∑F[j]/j!*2/(i-j)!

设新的函数G[i]=F[i]/i!,那么G[i]=∑G[j]*2/(i-j)!,后面是卷积形式,用ntt优化,又因为两边都有G,所以我们用cdq分治求和,复杂度nlog^2n

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ( << ) + , mod = ;
int n;
ll ans;
int rev[N];
ll a[N], b[N], fac[N], facinv[N], inv[N], f[N];
ll power(ll x, ll t)
{
ll ret = ;
for(; t; t >>= , x = x * x % mod) if(t & ) ret = ret * x % mod;
return ret;
}
void ntt(ll *a, int n, int f)
{
for(int i = ; i < n; ++i) if(i < rev[i]) swap(a[i], a[rev[i]]);
for(int m = ; m <= n; m <<= )
{
int mid = (m >> );
ll wn = power(, f == ? (mod - ) / m : mod - - (mod - ) / m);
for(int i = ; i < n; i += m)
{
ll w = ;
for(int j = ; j < mid; ++j)
{
ll u = a[i + j], v = a[i + j + mid] * w % mod;
a[i + j] = (u + v) % mod;
a[i + j + mid] = (u - v + mod) % mod;
w = w * wn % mod;
}
}
}
if(f == -)
{
ll inv = power(n, mod - );
for(int i = ; i < n; ++i) a[i] = a[i] * inv % mod;
}
}
void cdq(int l, int r)
{
if(l == r) return;
int mid = (l + r) >> ;
cdq(l, mid);
int lim = r - l + , n = , k = ;
while(n < lim)
{
n <<= ;
++k;
}
for(int i = ; i < n; ++i) rev[i] = (rev[i >> ] >> ) | ((i & ) << (k - ));
for(int i = ; i < n; ++i) a[i] = b[i] = ;
for(int i = l; i <= mid; ++i) a[i - l] = f[i];
for(int i = ; i < lim; ++i) b[i] = facinv[i];
ntt(a, n, );
ntt(b, n, );
for(int i = ; i < n; ++i) a[i] = a[i] * b[i] % mod;
ntt(a, n, -);
for(int i = mid + ; i <= r; ++i) f[i] = (f[i] + * a[i - l]) % mod;
cdq(mid + , r);
}
int main()
{
scanf("%d", &n);
fac[] = inv[] = facinv[] = ;
for(int i = ; i <= n; ++i)
{
fac[i] = fac[i - ] * i % mod;
if(i != ) inv[i] = (mod - mod / i) * inv[mod % i] % mod;
facinv[i] = facinv[i - ] * inv[i] % mod;
}
f[] = ;
cdq(, n);
for(int i = ; i <= n; ++i) ans = (ans + f[i] * fac[i] % mod) % mod;
printf("%lld\n", ans);
return ;
}

bzoj4555的更多相关文章

  1. 【BZOJ4555】求和(第二类斯特林数,组合数学,NTT)

    [BZOJ4555]求和(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 推推柿子 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)·j!·2^j\] \[=\sum_{i= ...

  2. 【BZOJ4555】求和(多种解法混合版本)

    [BZOJ4555]求和(多种解法混合版本) 题面 BZOJ 给定\(n\),求 \[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)\times 2^j \times ...

  3. [BZOJ4555][TJOI2016&HEOI2016]求和(分治FFT)

    4555: [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 525  Solved: 418[Sub ...

  4. [BZOJ4555 TJOI2016 HEOI2016 求和]

    ​ 第一篇博客,请大家多多关照.(鞠躬 BZOJ4555 TJOI2016 HEOI2016 求和 题意: ​ 给定一个正整数\(n\)(\(1\leqq n \leqq100000\)),求: \[ ...

  5. bzoj4555题解

    我们计算$f(i)=\sum_{j=1}^i S(i,j)\times 2^j\times (j!)$,容(o)易(e)知(i)道(s)$f(i)$的指数生成函数为$\frac{1}{3-2\time ...

  6. Bzoj4555: [Tjoi2016&Heoi2016]求和

    题面 Bzoj Sol 推柿子 因为当\(j>i\)时\(S(i, j)=0\),所以有 \[\sum_{i=0}^{n}\sum_{j=0}^{n}S(i, j)2^j(j!)\] 枚举\(j ...

  7. 【BZOJ4555】【TJOI2016】【HEOI2016】求和 第二类斯特林数 NTT

    题目大意 求\(f(n)=\sum_{i=0}^n\sum_{j=0}^i2^j\times j!\times S(i,j)\\\) 对\(998244353\)取模 \(n\leq 100000\) ...

  8. bzoj4555(多项式求逆解法)

    //和以前写的fft不太一样,可能是因为要取模?? #include<iostream> #include<cstring> #include<cmath> #in ...

  9. BZOJ4555 HEOI2016/TJOI2016求和(NTT+斯特林数)

    S(i,j)=Σ(-1)j-k(1/j!)·C(j,k)·ki=Σ(-1)j-k·ki/k!/(j-k)!.原式=ΣΣ(-1)j-k·ki·2j·j!/k!/(j-k)! (i,j=0~n).可以发现 ...

  10. 【Bzoj4555】【Luogu P4091】求和(NTT)

    题面 Bzoj Luogu 题解 先来颓柿子 $$ \sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj! \\ =\sum_{j=0}^n2^jj!\sum_{i=0}^nS(i,j ...

随机推荐

  1. 网络安全(超级详细)零基础带你一步一步走进缓冲区溢出漏洞和shellcode编写!

    零基础带你走进缓冲区溢出,编写shellcode. 写在前面的话:本人是以一个零基础者角度来带着大家去理解缓冲区溢出漏洞,当然如果你是开发者更好. 注:如果有转载请注明出处!创作不易.谢谢合作. 0. ...

  2. mysql大数据量分页查询优化

    参考文章:https://www.dexcoder.com/selfly/article/293 Mysql的分页查询十分简单,但是当数据量大的时候一般的分页就吃不消了. 传统分页查询:SELECT ...

  3. [scrapy]Item Loders

    Items Items就是结构化数据的模块,相当于字典,比如定义一个{"title":"","author":""},i ...

  4. ZT:三十个好习惯

  5. linux nc,nmap,telnet ,natstat命令

    说明 在服务器运维中 通常需要知道 机器端口状态 是否开启 是否被防火墙拦截等.今天我们介绍这三个命令 用来检测端口. nc 命令 / TCP # 安装 yum install -y nc nc 命令 ...

  6. CS 和 BS 的区别和优缺点(转)

    转自:http://www.cnblogs.com/scnuyz/p/5808808.html bs是浏览器(browser)和服务器(server) cs是静态客户端程序(client)和服务器(s ...

  7. 【POJ 3292】 Semi-prime H-numbers

    [POJ 3292] Semi-prime H-numbers 打个表 题意是1 5 9 13...这样的4的n次方+1定义为H-numbers H-numbers中仅仅由1*自己这一种方式组成 即没 ...

  8. 疯狂Java学习笔记(77)-----------凝视注意事项

    代码凝视,能够说是比代码本身更重要.这里有一些方法能够确保你写在代码中的凝视是友好的: 不要反复阅读者已经知道的内容 能明白说明代码是做什么的凝视对我们是没有帮助的. // If the color ...

  9. 依据iPhone6设计稿动态计算rem值

    rem 单位在做移动端的h5开发的时候是最常常使用的单位. 为解决自适应的问题.我们须要动态的给文档的更节点加入font-size 值.使用mediaquery 能够解决问题,可是每个文件都引用一大串 ...

  10. [转载]saltstack master配置文件中文翻译

    原文出处:http://blog.coocla.org/301.html Salt系统的配置是令人惊讶的简单,对于salt的两个系统都有各自的配置文件,salt-master是通过一个名为master ...