AcWing 3166. 第二类斯特林数
原题链接
中等
作者:
皓首不倦
,
2021-05-03 20:47:01
,
所有人可见
,
阅读 409
'''
第二类斯特林数求解,直接带入通项公式求解
'''
MOD = 1000000007
def pow_mod(a, k, p):
t = []
pow_val = 1 # 2的次幂数, 初始是2^0 = 1
a_pow = a % p # a^(2 ^ i)的数值, 初始是a^(2^0) = a
while pow_val <= k:
t.append(a_pow)
a_pow = (a_pow*a_pow) % p
pow_val <<= 1
ans = 1
for i in range(len(t)):
if k & 1:
ans = (ans * t[i]) % p
k >>= 1
return ans
max_val = 1000
t = [(0, 0)] * (max_val+1)
val = 1
for i in range(1, max_val+1):
val *= i
val %= MOD
_val = pow_mod(val, MOD-2, MOD) # val的阶乘的逆元
t[i] = (val, _val)
t[0] = t[1] # 0! 和 1! 数值是一样的把数值补齐
# a对b的组合数对MOD取模的数值
def C(a, b):
return (t[a][0] * t[b][1] * t[a-b][1]) % MOD
# 将1-n拆分成m个非空子集的方案数
def stiring2(n, m):
flag = 1
tot = 0
for k in range(0, m+1):
tot += flag * C(m, k) * pow_mod(m-k, n, MOD)
tot %= MOD
flag = -flag
tot = (tot * t[m][1]) % MOD
return tot
n, m = map(int, input().split())
print(stiring2(n, m))