NOJ 451 光棍节的快乐(组合数+全错位排列)

题目链接~~>

解题思路:

          瑞士数学家欧拉按一般情况给出了一个递推公式:用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作f(n)。假设把a错装进B里了,包含着这个错误的一切错装法分两类:
        (1)b装入A里,这时每种错装的其余部分都与A、B、a、b无关,应有f(n-2)种错装法。
        (2)b装入A、B之外的一个信封,这时的装信工作实际是把(除a之外的) 份信纸b、c……装入(除B以外的)n-1个信封A、C……,显然这时装错的方法有f(n-1)种。总之在a装入B的错误之下,共有错装法f(n-2)+f(n-1)种。a装入C,装入D……的n-2种错误之下,同样都有f(n-2)+f(n-1)种错装法,因此:           f( n )=( n-1 ) { f( n-1 ) + f( n-2 ) } 。
代码:
#include<stdio.h>
int main()
{
    long long int f[22],i,nx,mx,n,m ;//本题需用long long 
    f[1]=0 ;f[2]=1 ;
    for(i=3 ;i<=20 ;i++) // 递推公式
        f[i]=(i-1)*(f[i-1]+f[i-2]) ;
    while(scanf("%lld%lld",&n,&m)!=EOF)
    {
        nx=1 ;mx=1 ;
        for(i=n-m+1 ;i<=n ;i++)
                nx*=i ;
        for(i=m ;i>=2 ;i--)
                mx*=i ;
        printf("%lld\n",nx/mx*f[m]) ;
    }
    return 0 ;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Muti-Agent

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值