zoukankan      html  css  js  c++  java
  • NYOJ 451

    光棍节的快乐

    描述

    光棍们,今天是光棍节。聪明的NS想到了一个活动来丰富这个光棍节。

    规则如下:

    每个光棍在一个纸条上写一个自己心仪女生的名字,然后把这些纸条装进一个盒子里,这些光 棍依次抽取一张纸条,如果上面的名字就是自己心仪的女生,那么主持人就在现场给该女生打电话,告诉这个光棍对她的爱慕之情,并让光棍当场表白,并得到现场所有人的祝福,没抽到的,嘿嘿就可以幸免了。

    假设一共有N个光棍,其中有M个没有抽到自己的纸条,求发生这种情况一共有多少种可能.。

    输入
    每行包含两个整数N和M(1<M<=N<=20),以EOF结尾。
    输出
    对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。
    样例输入
    2 2
    3 2
    样例输出
    1
    3

    这道题考查的是全错位排列公式。题目本身很容易,就是要知道有这么一个经典问题的递推公式。

      用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之外的)(n-1 )份信纸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 <iostream>
     2 #include <stdio.h>
     3 #include <cmath>
     4 using namespace std;
     5 
     6 int main(){
     7     long long wrong[25];
     8     wrong[1]=0,    wrong[2]=1,wrong[3]=2; 
     9     for(int i=3;i<=20;i++){
    10         wrong[i] = (i-1)*(wrong[i-1]+ wrong[i-2] );
    11     }
    12     
    13     int m,n;
    14     while(scanf("%d%d",&n,&m)!=EOF){  
    15         double res = 1;
    16         for(int i=n,j=1;j<=m;j++,i-- ){
    17             res = res*i/j;
    18         } 
    19             
    20         long long res0 = res* wrong[m]; 
    21         printf("%lld
    ",res0);
    22         
    23     }
    24     
    25     return 0;
    26 }
    27  
  • 相关阅读:
    [模板] 循环数组的最大子段和
    [最短路][几何][牛客] [国庆集训派对1]-L-New Game
    [洛谷] P1866 编号
    1115 Counting Nodes in a BST (30 分)
    1106 Lowest Price in Supply Chain (25 分)
    1094 The Largest Generation (25 分)
    1090 Highest Price in Supply Chain (25 分)
    树的遍历
    1086 Tree Traversals Again (25 分)
    1079 Total Sales of Supply Chain (25 分 树
  • 原文地址:https://www.cnblogs.com/liugl7/p/5397901.html
Copyright © 2011-2022 走看看