4535 ACM 礼尚往来 数学排列组合

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4535
题意:每个礼物都不相同的组合个数
数学规律:
将每个女友排序为1···n,对应的女友送男友的礼物排序为1···n;
1<=k,h<=n;
k,h为1··n的任意数,且k不等于h
接下来讨论排列组合:
接下来在第k个女友的位置放上一个礼物,有n-1种可能;
假设k小于h
1···k···h···n(女友)
1···k···h···n(礼物)
不妨假设礼物h放在了女友k上,现在思考哈,在礼物中,除了礼物k放在女友中某一个位置的可能是n-1,其他礼物都是n-2,这是由于礼物k的位置(女友k)已经被放了。
接下来分两种情况讨论(L(n)表示n个礼物送个n个女友,每个礼物都不相同的组合个数)
·1·
k放在h位置上
那剩下位置有L(n-2)种可能。
·2·
k不放在h位置上
那剩下位置有L(n-1)种可能。
所以:L(n)=(n-1)(L(n-2)+L(n-1))

#include<cstdio>

#define mod 1000000007  //10^9 + 7
long long f[110]; void get()
{
f[1]=0;
f[2]=1;
for(int i=3;i<101;i++)
f[i]=(i-1)*(f[i-1]+f[i-2])%mod;
} int main()
{
get();//注意要函数调用
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%I64d\n",f[n]);
}
}
上一篇:session204 imessageApp sticker part I要点


下一篇:【Java Web开发学习】Spring加载外部properties配置文件