题目描述
n
<
=
1
0
5
n<=10^5
n<=105
题目分析
我们惊喜地发现这竟然是一道数论题。- 第二类斯特林数定义 S ( n , m ) S(n,m) S(n,m):
- 首先关于第二类斯特林数有一个特别重要的公式。
- S ( i , j ) = 1 j ! ∗ ∑ k = 1 j ( − 1 ) k ∗ C j k ∗ ( j − k ) i S(i,j)=\frac{1}{j!}*\sum_{k=1}^{j}(-1)^k*C_j^k*(j-k)^i S(i,j)=j!1∗∑k=1j(−1)k∗Cjk∗(j−k)i
- 这是一个容斥,枚举有多少个集合是空的,但最后因为每一个集合是相同的,所以要除以 j ! j! j!
- 然后我们把这个东西套进题目的式子里:
- ∑ i = 0 n ∑ j = 0 i S ( i , j ) ∗ 2 j ∗ j ! \sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*j! ∑i=0n∑j=0iS(i,j)∗2j∗j!
- = ∑ i = 0 n ∑ j = 0 n S ( i , j ) ∗ 2 j ∗ j ! =\sum_{i=0}^n\sum_{j=0}^nS(i,j)*2^j*j! =∑i=0n∑j=0nS(i,j)∗2j∗j!
- = ∑ j = 0 n 2 j ∗ j ! ∗ ∑ i = 0 n S ( i , j ) =\sum_{j=0}^n2^j*j!*\sum_{i=0}^nS(i,j) =∑j=0n2j∗j!∗∑i=0nS(i,j)
- = ∑ j = 0 n 2 j ∗ j ! ∗ ∑ i = 0 n 1 j ! ∗ ∑ k = 1 j ( − 1 ) k ∗ C j k ∗ ( j − k ) i =\sum_{j=0}^n2^j*j!*\sum_{i=0}^n\frac{1}{j!}*\sum_{k=1}^{j}(-1)^k*C_j^k*(j-k)^i =∑j=0n2j∗j!∗∑i=0nj!1∗∑k=1j(−1)k∗Cjk∗(j−k)i
- = ∑ j = 0 n 2 j ∗ j ! ∗ ∑ i = 0 n 1 j ! ∗ ∑ k = 1 j ( − 1 ) k ∗ j ! k ! ( j − k ) ! ∗ ( j − k ) i =\sum_{j=0}^n2^j*j!*\sum_{i=0}^n\frac{1}{j!}*\sum_{k=1}^{j}(-1)^k*\frac{j!}{k!(j-k)!}*(j-k)^i =∑j=0n2j∗j!∗∑i=0nj!1∗∑k=1j(−1)k∗k!(j−k)!j!∗(j−k)i
- = ∑ j = 0 n 2 j ∗ j ! ∗ ∑ i = 0 n ∑ k = 1 j ( − 1 ) k ∗ ( j − k ) i k ! ( j − k ) ! =\sum_{j=0}^n2^j*j!*\sum_{i=0}^n\sum_{k=1}^{j}(-1)^k*\frac{(j-k)^i}{k!(j-k)!} =∑j=0n2j∗j!∗∑i=0n∑k=1j(−1)k∗k!(j−k)!(j−k)i
- = ∑ j = 0 n 2 j ∗ j ! ∗ ∑ k = 1 j ∑ i = 0 n ( − 1 ) k ∗ ( j − k ) i k ! ( j − k ) ! =\sum_{j=0}^n2^j*j!*\sum_{k=1}^{j}\sum_{i=0}^n(-1)^k*\frac{(j-k)^i}{k!(j-k)!} =∑j=0n2j∗j!∗∑k=1j∑i=0n(−1)k∗k!(j−k)!(j−k)i
- = ∑ j = 0 n 2 j ∗ j ! ∗ ∑ k = 1 j ( − 1 ) k k ! ∑ i = 0 n ( j − k ) i ( j − k ) ! =\sum_{j=0}^n2^j*j!*\sum_{k=1}^{j}\frac{(-1)^k}{k!}\sum_{i=0}^n\frac{(j-k)^i}{(j-k)!} =∑j=0n2j∗j!∗∑k=1jk!(−1)k∑i=0n(j−k)!(j−k)i
- 用等比数列求和,可得:
- = ∑ j = 0 n 2 j ∗ j ! ∗ ∑ k = 1 j ( − 1 ) k k ! ∗ ( j − k ) n + 1 − 1 ( j − k − 1 ) ( j − k ) ! =\sum_{j=0}^n2^j*j!*\sum_{k=1}^{j}\frac{(-1)^k}{k!}*\frac{(j-k)^{n+1}-1}{(j-k-1)(j-k)!} =∑j=0n2j∗j!∗∑k=1jk!(−1)k∗(j−k−1)(j−k)!(j−k)n+1−1
- 经过了一系列转折,我们终于接近终点,我们设:
- f ( i ) = ( − 1 ) i i ! f(i)=\frac{(-1)^i}{i!} f(i)=i!(−1)i, g ( i ) = i n + 1 − 1 ( i − 1 ) ∗ i ! g(i)=\frac{i^{n+1}-1}{(i-1)*i!} g(i)=(i−1)∗i!in+1−1
- 所以原式 = ∑ j = 0 n 2 j ∗ j ! ∗ ∑ k = 1 j f ( k ) ∗ g ( j − k ) =\sum_{j=0}^n2^j*j!*\sum_{k=1}^{j}f(k)*g(j-k) =∑j=0n2j∗j!∗∑k=1jf(k)∗g(j−k)
- 我们发现这是一个标准的卷积,所以用NTT求即可。
- 时间复杂度 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)