求 $\sum\limits_{i=0}^n\sum\limits_{j=0}^n Stirling2(i,j) \times 2^j \times j!$

$n \leq 100000$

sol:

小清新斯特林数多项式题

首先熟知斯特林数的卷积形式 $Stirling2(i,j) = \sum\limits_{k=0}^j \frac{(-1)^{(j-k)}}{(j-k)!} \times \frac{k^i}{k!}$

这题就是先对 $i$ 求个前缀和,再乘以 $2^j \times j!$ 再求和

于是卷积后一项的 $k^i \rightarrow \sum\limits_{i=0}^n k^i$

这是一个等比数列求和的形式,注意特判一下 $k=1$ 形式即可

然后就是套路啦,令 $A(x) = \frac{\sum\limits_{i=0}^n{k^i}}{k!} x$,$B(x)=\frac{(-1)^i}{i!}$,$C = A \times B$

则 $ans = \sum\limits_{i=0}^n 2^i \times i! \times [x^i]C(x)$

注意 $A(x),B(x),C(x)$ 的常数项都是 $1$

#include <bits/stdc++.h>
#define LL long long
#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
using namespace std;
inline int read() {
int x = ,f = ; char ch = getchar();
for(; !isdigit(ch); ch = getchar())if(ch == '-') f = -f;
for(; isdigit(ch); ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = , mod = ;
inline int inc(int x, int y) { x += y; if(x >= mod) x -= mod; return x; }
inline int dec(int x, int y) { x -= y; if(x < ) x += mod; return x; }
inline int mul(int x, int y) { return 1LL * x * y % mod; }
inline int ksm(int x, int t, int res = ) { for(; t; x = mul(x, x), t = t >> ) if(t & ) res = mul(res, x); return res; }
int n, a[maxn], b[maxn];
int r[maxn], lg[maxn], fac[maxn], ifac[maxn], pw[maxn];
void fft(int *a, int n, int f) {
rep(i, , n-) r[i] = (r[i >> ] >> ) | ((i & ) << (lg[n] - ));
rep(i, , n-) if(i < r[i]) swap(a[i], a[r[i]]);
for(register int i = ; i < n; i <<= ) {
int wn = ksm(, (mod - ) / (i << ));
if(f == -) wn = ksm(wn, mod - );
for(register int j = ; j < n; j += (i << )) {
int w = ;
for(register int k = ; k < i; k++, w = mul(w, wn)) {
int x = a[j + k], y = mul(w, a[j + k + i]);
a[j + k] = inc(x, y);
a[j + k + i] = dec(x, y);
}
}
}
if(f == -) {
int inv_n = ksm(n, mod - );
rep(i, , n - ) a[i] = mul(a[i], inv_n);
}
}
inline int cal(int x) {
if(x == ) return n + ;
else return mul(dec(ksm(x, n+), ), ksm(dec(x, ), mod - ));
}
int main() {
lg[] = -; rep(i, , maxn - ) lg[i] = lg[i >> ] + ;
n = read(); int len = ; for(; len <= (n<<); len <<= );
fac[] = ifac[] = ifac[] = pw[] = ; rep(i, , n) fac[i] = mul(fac[i - ], i);
rep(i, , n) ifac[i] = mul((mod - mod / i), ifac[mod % i]);
rep(i, , n) ifac[i] = mul(ifac[i], ifac[i - ]);
//cout << mul(ifac[3], fac[3]) << endl;
rep(i, , n) pw[i] = inc(pw[i - ], pw[i - ]);
a[] = b[] = ; rep(i, , n) a[i] = mul(cal(i), ifac[i]);
rep(i, , n) b[i] = (i & ) ? (mod - ifac[i]) : ifac[i];
fft(a, len, ); fft(b, len, );
//for(int i=0;i<len;i++) cout << a[i] << " "; cout << endl;
// for(int i=0;i<len;i++) cout << b[i] << " "; cout << endl;
rep(i, , len - ) a[i] = mul(a[i], b[i]);
// for(int i=0;i<len;i++) cout << a[i] << " "; cout << endl;
fft(a, len, -); int ans = ;
//for(int i=1;i<=n;i++) cout << a[i] << " "; cout << endl;
rep(i, , n) ans = inc(ans, mul(pw[i], mul(fac[i], a[i])));
cout << inc(ans, ) << endl;
}

还有一个小清新多项式求逆的做法

令 $f(n) = \sum\limits_{i=0}^n Stirling2(n,i) \times i! \times 2^i$,这个东西的组合意义为把 $n$ 个不同的物品放入若干个不同的集合中,且每个集合有两种不同的状态的方案数

枚举最后一个集合的大小和状态,得到 $f(n) = \sum\limits_{i=1}^n 2 \times \binom{n}{i} \times f(n-i)$

多项式求逆即可(远古代码

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = ,P = ,G = ;
int n,L,num,R[maxn],a[maxn],b[maxn],c[maxn],d[maxn];
int m;
int INV[maxn];
inline int ksm(int x,int t)
{
int res = ;
while(t)
{
if(t & ) res = 1LL * res * x % P;
x = 1LL * x * x % P;
t >>= ;
}
return res;
}
inline void NTT(int *a,int f,int n,int L)
{
for(int i=;i<n;i++) R[i] = (R[i>>] >> ) | ((i & ) << (L - ));
for(int i=;i<n;i++)if(i < R[i])swap(a[i],a[R[i]]);
for(int i=;i<n;i<<=)
{
int wn = ksm(G,(P - ) / (i << ));
if(f == -)wn = ksm(wn,P - );
for(int j=;j<n;j+=(i<<))
{
int w = ;
for(int k=;k<i;k++,w=1LL * w * wn % P)
{
int x = a[j + k], y = 1LL * w * a[j + k + i ] % P;
a[j + k] = ((x + y) % P + P) % P;
a[j + k + i] = ((x - y) % P + P) % P;
}
}
}
if(f == -)
{
int inv = ksm(n,P - );
for(int i=;i<n;i++)a[i] = 1LL * a[i] * inv % P;
}
}
inline void inverse(int *a,int *b,int n,int L)
{
if(n == ){b[] = ksm(a[],P - );return;}
inverse(a,b,n>>,L-);
memcpy(c,a,n*sizeof(int));memset(c+n,,n*sizeof(int));
NTT(c,,n<<,L+);NTT(b,,n<<,L+);
for(int i=;i<(n<<);i++) b[i] = 1LL * b[i] * (( - 1LL * c[i] * b[i] % P + P) % P) % P;
NTT(b,-,n<<,L+);memset(b+n,,n*sizeof(int));
}
int main()
{
scanf("%d",&n);
for(INV[] = INV[] = a[] = m=;m<=n;m<<=)L++;
for (int i=; i<=n; i++) INV[i]=P-(LL)INV[P%i]*(P/i)%P;
for (int i=; i<=n; i++) INV[i]=(LL)INV[i-]*INV[i]%P;
for (int i=; i<=n; i++) a[i]=((P-INV[i])<<)%P;
inverse(a,b,m,L);
int ans=b[n];
for (int i=n;i;i--) ans=((LL)ans*i+b[i-])%P;
printf("%d\n",ans);
return ;
}

bzoj 4555 求和的更多相关文章

  1. [BZOJ 4555][Tjoi2016&Heoi2016]求和

    题意 给定 $n$ , 求下式的值: $$ f(n)= \sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\ j\end{Bmatrix}\times 2^j\time ...

  2. BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)

    题目链接 (luogu) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

  3. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  4. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  5. BZOJ 4555: [Tjoi2016&Heoi2016]求和 (NTT + 第二类斯特林数)

    题意 给你一个数 \(n\) 求这样一个函数的值 : \[\displaystyle f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i} \begin{Bmatrix} i \\ j ...

  6. 【BZOJ 4555】 4555: [Tjoi2016&Heoi2016]求和 (NTT)

    4555: [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 315  Solved: 252 Des ...

  7. bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...

  8. BZOJ 4555 [Tjoi2016&Heoi2016]求和 (多项式求逆)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4555 题目大意: 给定 \(S(n,m)\) 表示第二类斯特林数,定义函数 \(f(n ...

  9. 【BZOJ 4555】[Tjoi2016&Heoi2016]求和 多项式求逆/NTT+第二类斯特林数

    出处0.0用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O(n ...

随机推荐

  1. Linux下代理服务器(proxy)配置

    Linux下有很多程序都只有命令行接口,对于这类程序,它们通过代理服务器(proxy)访问网络的方式也不尽相同.在本文中Easwy总结了一些常用Linux程序配置代理服务器的方法. [ 通用代理服务器 ...

  2. Cookie应用参考

    内容来自imooc.

  3. 【c++习题】【17/4/13】stack

    1.stack 模板.动态内存分配.析构 #include "stack2.cpp" #include <iostream> using namespace std; ...

  4. m2eclipse插件——添加依赖不显示搜索结果

    使用Eclipse,安装m2eclipse插件之后,选中Maven项目的pom文件,添加依赖,点击“Add Dependency”的时候,输入要检索的jar包名称,search result却一直为空 ...

  5. centos上mailx通过465端口发送邮件

    最近在看zabbix发送邮件的时候,发现自己的邮件总是无法发送,这里可能是外网防火墙禁止25端口,那么如何绕过25端口呢?  我使用的是163邮箱的TSL加密协议465端口 由于mailx基本配置很简 ...

  6. fabric文件上传打包与校验

  7. Address already in use: make_sock: could not bind to address [::]:80

    **********************************************************处理办法:# ps -aux | grep httpWarning: bad syn ...

  8. RemoveDuplicatesFromSortedArrayI II,移除有序数组里的重复元素以及移除数组里的某个元素

    RemoveDuplicatesFromSortedArrayI: 问题描述:给定一个有序数组,去掉其中重复的元素.并返回新数组的长度.不能使用新的空间. [1,1,2,3] -> [1,2,3 ...

  9. perl非root用户安装模块

    install perl Module 1. search module's package on [Google](https://www.google.com) or [CPAN Search S ...

  10. Java条件语句之 if...else

    if...else 语句的操作比 if 语句多了一步:  当条件成立时,则执行 if 部分的代码块: 条件不成立时,则进入 else 部分.例如,如果考试成绩大于 90 分,则奖励一个 IPHONE  ...