洛谷 P1595 信封问题(周五杂题选讲)(错排公式)

Posted ljp20021026

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1595 信封问题(周五杂题选讲)(错排公式)相关的知识,希望对你有一定的参考价值。

题目描述

某人写了n封信和n个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。

输入输出格式

输入格式:

 

一个信封数n(n<=20)

 

输出格式:

 

一个整数,代表有多少种情况。

题解

本题即为伯努利信封问题

360百科:错排公式

STD

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int b(int n)
 5 {
 6     if (n==1) return 0;
 7     else if (n==2) return 1;
 8     else return (n-1)*(b(n-1)+b(n-2));
 9 }
10 int main()
11 {
12     ios::sync_with_stdio(false);
13     cin>>n;
14     cout<<b(n);
15     return 0;
16 }

 

然而这题范围只有二十...

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int main(){
 5     cin>>n;
 6     if(n==1){
 7         cout<<0;
 8         return 0;
 9     }
10     if(n==2){
11         cout<<1;
12         return 0;
13     }
14     if(n==3){
15         cout<<2;
16         return 0;
17     }
18     if(n==4){
19         cout<<9;
20         return 0;
21     }
22     if(n==5){
23         cout<<44;
24         return 0;
25     }
26     if(n==6){
27         cout<<265;
28         return 0;
29     }
30     if(n==7){
31         cout<<1854;
32         return 0;
33     }
34     if(n==8){
35         cout<<14833;
36         return 0;
37     }
38     if(n==9){
39         cout<<133496;
40         return 0;
41     }
42     if(n==10){
43         cout<<1334961;
44         return 0;
45     }
46     if(n==11){
47         cout<<14684570;
48         return 0;
49     }
50     if(n==12){
51         cout<<176214841;
52         return 0;
53     }
54     if(n==13){
55         cout<<2290792932;
56         return 0;
57     }
58     if(n==14){
59         cout<<32071101049;
60         return 0;
61     }
62     if(n==15){
63         cout<<481066515734;
64         return 0;
65     }
66     if(n==16){
67         cout<<7697064251745;
68         return 0;
69     }
70     if(n==17){
71         cout<<130850092279664;
72         return 0;
73     }
74     if(n==18){
75         cout<<2355301661033953;
76         return 0;
77     }
78     if(n==19){
79         cout<<44750731559645106;
80         return 0;
81     }
82     if(n==20){
83         cout<<895014631192902121;
84         return 0;
85     }
86 }

 

不要问我第二段从哪来的,我是打出STD后CV大法搞出来的...

 

以上是关于洛谷 P1595 信封问题(周五杂题选讲)(错排公式)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1595 信封问题

[做题笔记] pb大师的杂题选讲

11.28杂题选讲

杂题选讲

正睿OI DAY3 杂题选讲

「总结」杂题选讲