版本1和2间的区别
于2008-09-25 18:51:18修订的的版本1
大小: 989
编辑: 218
备注:
于2008-09-25 18:51:27修订的的版本2
大小: 378
编辑: 218
备注:
删除的内容标记成这样。 加入的内容标记成这样。
行号 3: 行号 3:
/*
1465 不容易系列之一,递推求解
ymc 2008/9/23
题目大意:
有n封信和n个信封,求所有的信都装错信封,共有多少种不同情况。
分析与解题思路:
称n封信与n个信封,所有信装错信封的个数为n错排数。
设F[n]为n错排数,设
a1,a2,,,.an为1,2,...n的一个错排。
则找到n所在的数,假设为ai,交换ai与an,得到
a1,a2,,an,..an-1,ai=n
前面的n-1个数a1,a2,..an,..an-1有两种情况
1)为n-1错排数,总共有F[n-1]种,
2)an没有错排,剩下的n-2个数错排。则有F[n-2]种。
又ai有n-1种可能。则
F[n]=(F[n-1]+F[n-2])*(n-1)
注意:用int会溢出
*/
#include <iostream>
using namespace std;
const int N=21;
long long F[N];
void Init()
{
    F[1]=0;
    F[2]=1;
    for(int i=3;i<N;i++)
        F[i]=(F[i-1]+F[i-2])*(i-1);
}
int main()
{
    int n;
    Init();
    while(cin>>n)
    {
        cout<<F[n]<<endl;
/*经典的错排公式*/
#include <stdio.h>

__int64 a[21];

void init(){
    a[1] = 0;
    a[2] = 1;
    a[3] = 2;
    int i;
    for(i=4; i< 21; i++){
        a[i] = (i-1) * (a[i-1] + a[i-2]);
行号 42: 行号 18:
int main(){
    init();
    int n;
    while(scanf("%d", &n)!=EOF){
        printf("%I64d\n", a[n]);
    }

    return 0;
}

   1 /*经典的错排公式*/
   2 #include <stdio.h>
   3 
   4 __int64 a[21];
   5 
   6 void init(){
   7     a[1] = 0;
   8     a[2] = 1;
   9     a[3] = 2;
  10     int i;
  11     for(i=4; i< 21; i++){
  12         a[i] = (i-1) * (a[i-1] + a[i-2]);
  13     }
  14 }
  15 
  16 int main(){
  17     init();
  18     int n;
  19     while(scanf("%d", &n)!=EOF){
  20         printf("%I64d\n", a[n]);
  21     }
  22 
  23     return 0;
  24 }

hdu1465 参考答案 (2008-09-25 18:51:27由218编辑)

ch3n2k.com | Copyright (c) 2004-2020 czk.