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]);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值