一个简单的求Bell数的方法
程序员文章站
2022-06-05 12:17:40
...
前言
贝尔数大概大家都不陌生,但是怎么求却有许多种方式,有根据定义这些做法都太垃圾了 这里给大家介绍一种
正文
首先根据贝尔数的定义,有
那么再由第二类斯特林数的展开式可得
这样子,设
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll p = 998244353;
const ll N = 1e5+10;
ll fac[N] , facinv[N] , n , a[N] , b[N] , sum[N] , ans;
ll qpow(ll a, ll b, ll p) {
ll res = 1;
for(; b; b >>= 1, a = (a * a) % p) {
if(b & 1) res = (res * a) % p;
}
return res;
}
void pre() {
fac[0]=1;
facinv[0] = 1;
for(int i = 1; i <= n; i ++ ) {
fac[i] = ( fac[i-1] * i ) % p ;
facinv[i] = qpow( fac[i] , p - 2 , p ) ;
}
}
int main() {
scanf("%lld", &n);
pre();
for (int i = 0 ; i <= n ; i++) {
a[i] = facinv[i];
if ( i % 2 ) a[i] = p - a[i] ;
b[i] = qpow( i , n , p ) * facinv[i] % p;
sum[i] = ( sum[i-1] + b[i] ) % p;
}
for (int i = 0 ; i <= n ; i++ ) ans = ( ans + a[i] * sum[n-i] ) % p;
cout<<ans;
return 0;
}
下一篇: THINKPHP之控制器