<转>
假设有3对夫妻Aa,Bb,Dd;
A选b后 , B有两种选择a和d 。 但是B选a 后,D就只能选d了。
所以(3-1)*(3-1)!是不对的。
======================
//计算公式
//f(n)=n!-C(n,1)*f(n-1)-C(n,2)*f(n-2)-……-C(n,n-2)*f(2)-1
//计算思路:所有夫妻男女组合的总数(n!)-只有一对夫妻在一块的组合-
//2对夫妻在一起的组合…………
#include <stdio.h>
#define NUM 10
long P(long n)
{
if(n==1) return 1;
else return n*P(n-1);
}
long C(int n,int m)
{
return (P(n)/(P(m)*P(n-m)));
}
long sub(int n,int F[])
{
int i;
long result=0;
if(n==2)
return 1;
else
{
for(i=1;i<n;i++)
result+=C(n,i)*F;
return result+1;
}
}
void main()
{
int i,result=0,F[NUM];
F[0]=0;
F[1]=0;
for(i=2;i<=NUM;i++)
{
result=P(i)-sub(i,F);
F=result;
printf("\n%2d %ld",i,result);
}
}
结果:
2 1
3 2
4 9
5 44
6 265
7 1854
8 14833
9 133496
10 1334961
例:
2:21 total 1
3:312 231 total 2
4:2143 4123 3142 2413 3412 4312 2341 3421 4321
total 9
5:21534 21453 31254 51234 41253 31524 41523 51423 31452 41532
51432 23154 25134 24153 35124 53124 45123 54123 34152 43152
45132 54132 23514 24513 25413 35214 53214 45213 54213 34512
35412 43512 53412 23451 24531 25431 34251 43251 45231 54231
34521 35421 43521 53421
total 44
说明:21的意思是 2号->1号 1号->2号
312的意思:3->1 1->2 2->3
2143 :2->1 1->2 4->3 3->4
25413 :2->1 5->2 4->3 1->4 3->5
|