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

举报
Linux猿 发表于 2021/08/04 23:58:02 2021/08/04
【摘要】 题目链接~~> 解题思路:           瑞士数学家欧拉按一般情况给出了一个递推公式:用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作f(n)。假设把a错装进B里了,包含着这个错误的一切错装法分两类: &n...

题目链接~~>

解题思路:

          瑞士数学家欧拉按一般情况给出了一个递推公式:用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 ) } 。
代码:

   
  1. #include<stdio.h>
  2. int main()
  3. {
  4. long long int f[22],i,nx,mx,n,m ;//本题需用long long
  5. f[1]=0 ;f[2]=1 ;
  6. for(i=3 ;i<=20 ;i++) // 递推公式
  7. f[i]=(i-1)*(f[i-1]+f[i-2]) ;
  8. while(scanf("%lld%lld",&n,&m)!=EOF)
  9. {
  10. nx=1 ;mx=1 ;
  11. for(i=n-m+1 ;i<=n ;i++)
  12. nx*=i ;
  13. for(i=m ;i>=2 ;i--)
  14. mx*=i ;
  15. printf("%lld\n",nx/mx*f[m]) ;
  16. }
  17. return 0 ;
  18. }

 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/15498793

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。