自然数幂和[第二类斯特林数求法]

自然数幂和

写在前面
  1. 本文中提到的斯特林数和S都指代第二类斯特林数
  2. \(S_{k,j}\)表示把k个有区别的球放入j个无区别的盒子的方案数 [不存在空盒]
推导

对于一个\(i^k\)

可以具体理解为有 \(i\) 个不同的盒子,把 \(k\) 个不同的球放入盒子中的方案数。[允许空盒]

现在把允许空盒 转化成 求所有盒子都至少放入一个球的方案数

首先枚举放了至少一个球的盒子个数,设为$ j$

那么对于存在j个空盒的方案就为 \(S_{k,j}*C_{i,j}*j!\)

对于一个 \(i^k\) ,可以表示为 \[ \sum \limits _{j=1}^{i} S_{k,j}*C_{i,j}*j! \]

然后就可以表示出 \(\sum \limits ^{n}_{i=0} i^k\) 的方案:\[ \sum \limits _{i=0}^{n}\sum\limits _{j=1}^{i} S_{k,j}*C_{i,j}*j! \]

然后讨论 \(S_{k,j}\)的系数和: \(\sum \limits ^{n}_{i=0} C_{i,j} *j!\) ,即 \(j!* \sum\limits^{n}_{i=0} C_{i,j}\)

已知: \(\sum \limits_{i=0}^{n}C_{i,j}=C_{n+1,j+1}\)

所以 \(S_{j,k}\)的系数为 \(j!*C_{n+1,j+1}\)

那么就可以知道 \(\sum \limits ^{n}_{i=0} i^k= \sum\limits_{j=1}^{n}S_{k,j}*j!*C_{n+1,j+1}\)

然后预处理斯特林数和组合数就可以解决了.

\(By\) \(Zerokei\)

原文地址:https://www.cnblogs.com/Zerokei/p/9726879.html

时间: 2024-10-22 12:11:40

自然数幂和[第二类斯特林数求法]的相关文章

第二类斯特林数模板

第二类斯特林数S(n,m)表示的是把 n 个不同的小球放在 m 个相同的盒子里方案数. 递推式子如下.初始化 S[0][0] = 1 S(n,m) = S(n?1,m?1) + mS(n?1,m) const LL mod = 1e9 + 7; LL S[maxn][maxn]; inline void init() { S[0][0] = 1; for(int i=1; i<maxn; i++){ for(int j=1; j<=i; j++){ S[i][j] = ( S[i-1][j-1

第二类斯特林数

含义 \(n\)个有区别的球放在\(m\)个相同的盒子内,要求盒子不为空的方案数 实际上也就是把数\(n\)拆成\(m\)个正整数和的方案数 记作\(S(n, m)\) 性质 \(S(n, 0)=S(0, n)=0\),其中\(n \in N\) \(S(n, k)=0\),其中\(k>n>=1\) \(S(n, n)=S(n, 1)=1\),其中\(n>=1\) 等等...... 求法 递推 \[S(n, m) = S(n - 1, m - 1) + S(n - 1, m) * m\]

【BZOJ 4555】[Tjoi2016&amp;Heoi2016]求和 NTT+第二类斯特林数

用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O(n^2logn)的,还不如暴力,但是我们发现,对于刚刚提到的容斥的式子,将其化为卷积形式后,其一边的每一项对于每一个i都相同,另一边的每一项是对于所有的i形成一个n项的等比数列,这样我们可以把成等比数列的一边求和,用固定的一边去卷他们的和,这时候的答案的每一项就是所有的i的这一项的和,然后我们再O(n)乘上阶乘

Gym 101147G 第二类斯特林数

大致题意: n个孩子,k场比赛,每个孩子至少参加一场比赛,且每场比赛只能由一个孩子参加.问有多少种分配方式. 分析: k>n,就无法分配了. k<=n.把n分成k堆的方案数乘以n的阶乘.N分成k堆得方案数即第二类斯特林数 http://blog.csdn.net/acdreamers/article/details/8521134 #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll

Light OJ 1236 Race 第二类斯特林数

第二类斯特林数 n 匹马 分成1 2 3... n组 每一组就是相同排名 没有先后 然后组与组之间是有顺序的 在乘以组数的阶乘 #include <cstdio> #include <cstring> using namespace std; int dp[1010][1010]; int a[1010]; int main() { a[0] = 1; dp[0][0] = 1; for(int i = 1; i <= 1000; i++) { dp[i][0] = 0; d

swjtu oj Paint Box 第二类斯特林数

http://swjtuoj.cn/problem/2382/ 题目的难点在于,用k种颜色,去染n个盒子,并且一定要用完这k种颜色,并且相邻的格子不能有相同的颜色, 打了个表发现,这个数是s(n, k) * k! s(n, k)表示求第二类斯特林数. 那么关键是怎么快速求第二类斯特林数. 这里提供一种O(k)的算法. 第二类斯特林数: #include <cstdio> #include <cstdlib> #include <cstring> #include <

hdu 2512 一卡通大冒险(第二类斯特林数)

递推思路如下,i张卡片分成j堆,那么分为两种情况:第i张卡片自成一堆或没有自成一堆. 那么自成一堆的话就是dp[i-1][j-1]种情况 不自成一堆的话就是就能在j堆种任意挑一堆放入,所以有dp[i-1][j]*j种情况 综上,如下: dp[i][j]=dp[i-1][j]*j+dp[i-1][j-1]. 关于第二类斯特林数,百度就好. 具体代码 #include <iostream> using namespace std; int dp[2005][2005]; int main() {

poj 3088 组合计数,第二类斯特林数

题意:给出n个数字[1,n],问你可以组成多少种不同的序列,其中每一个序列由几个部分组成,每个部分包含几个数字,每部分内数字无序,部分之间数字有序.每个数字最多使用一次,可以不用. 思路:枚举从n个数字中选出i个数字(组合数),再枚举将这i个数字分成j个部分(第二类斯特林数),然后乘上j的全排列. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5

LightOJ 1326 - Race(第二类斯特林数啊 )

题目链接:http://lightoj.com/volume_showproblem.php?problem=1326 百度百科:斯特林数 ACdreamer:第一类Stirling数和第二类Stirling Disky and Sooma, two of the biggest mega minds of Bangladesh went to a far country. They ate, coded and wandered around, even in their holidays.