知道f:A->B这个函数(其中|A|=n, |B|=m)的所有映射关系要使B的每个元素都要被A的一个元素覆盖到。
数字可能很大你只要输出方案数模1,000,000,007即可。
Input
一共一行两个数,n和m。(1<=n,m<=1,000,000)
Output
一共一行包含一个方案数。
Input示例
2 2
Output示例
2
思路:斯特林数
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;
typedef long long int ll;
const int MAXN = 1000005;
const int MOD = 1e9 + 7;
int n, m, a[MAXN], result;
ll fac[MAXN], inv[MAXN];
ll Pow(ll a,int b)
{
ll res = 1;
while (b)
{
if (b & 1)
{
res = (res * a) % MOD;
}
b >>= 1;
a = (a * a) % MOD;
}
return res;
}
ll C(int n,int m)
{
return fac[n] * Pow(fac[n-m] * fac[m] %MOD, MOD-2) % MOD;
}
void init()
{
fac[0] = 1;
for (int i = 1; i <= 1000000; i++)
{
fac[i] = fac[i-1] * i % MOD;
}
inv[1]= 1;
for (int i = 2; i <= 1000000; i++)
{
inv[i] = (ll)(MOD-MOD/i) * inv[MOD%i] % MOD;
}
}
int main()
{
init();
cin >> n >> m;
result = 0;
for (int i = 0, e = 1; i <= m; i++)
{
result = (result + (e * Pow(m-i, n) * C(m, i)) % MOD) % MOD;
e *= (-1);
}
cout << (result + MOD) % MOD << endl;
return 0;
}