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]);
    }
}
posted @ 2018-08-30 17:27  CheeseIce  阅读(160)  评论(0编辑  收藏  举报