⇤ ← 于2008-09-25 18:51:18修订的的版本1
大小: 989
备注:
|
← 于2008-09-25 18:51:27修订的的版本2 ⇥
大小: 378
备注:
|
删除的内容标记成这样。 | 加入的内容标记成这样。 |
行号 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 }