设A,B为有限集合,且|A|=m,|B|=n,求出从集合A到B的所有满射函数的个数。
枚举法
下面为m=5、n=3 时的代码,枚举
#include <stdio.h>
int main(){
int sum=0;
int n=3;//m为循环嵌套的次数
int x1,x2,x3,x4,x5;
for(x1=0;x1<n;x1++)//m为循环嵌套的次数
for(x2=0;x2<n;x2++)
for(x3=0;x3<n;x3++)
for(x4=0;x4<n;x4++)
for(x5=0;x5<n;x5++){
int m=0,i;
for(i=0;i<n;i++){
if(x1==i||x2==i||x3==i||x4==i||x5==i)
m++;
}
if(m==n)
sum++;
}
printf("sum=%d",sum);
return 0;
}
公式法
公式如下
#include <stdio.h>
#include <math.h>
int fact(int a); //求阶乘
int comb(int a, int b); //求组合数
int main()
{
int m, n, i, sum = 0;
scanf("%d %d", &m, &n);
for (i = 0; i < n; i++) //偶数项加,奇数项减
{
if (i % 2 == 0)
sum += comb(n, n - i) * pow(n - i, m);
else
sum -= comb(n, n - i) * pow(n - i, m);
}
printf("sum=%d", sum);
return 0;
}
int fact(int a) //递归求阶乘
{
if (a == 0)
return 1;
return a * fact(a - 1);
}
int comb(int a, int b) //求组合数
{
return fact(a) / (fact(b) * fact(a - b));
}