洛谷 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大法搞出来的...

原文地址:https://www.cnblogs.com/ljp20021026/p/8535493.html

时间: 2024-08-02 22:19:35

洛谷 P1595 信封问题(周五杂题选讲)(错排公式)的相关文章

正睿OI DAY3 杂题选讲

正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n\leq k^2\) 暴力 \(n\geq k^2\),找点x,求直线l经过x,且点数最多,点数\(\geq k+1\),递归,否则再找一个 One Point Nine Nine 现在平面上有\(n\)个点,已知有一个常数\(D\). 任意两点的距离要么\(\leq D\),要么\(\geq 1.

洛谷 P1595 信封问题

P1595 信封问题 题目描述 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都装错信封共有多少种不同情况. 输入输出格式 输入格式: 一个信封数n(n<=20) 输出格式: 一个整数,代表有多少种情况. 输入输出样例 输入样例#1: 复制 2 输出样例#1: 复制 1 输入样例#2: 复制 3 输出样例#2: 复制 2思路:错排公式. #include<cstdio> #include<cstring> #include<iostream> #in

洛谷P1595 信封问题

P1595 信封问题 最新讨论 = = 题目描述 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都装错信封共有多少种不同情况. 输入输出格式 输入格式: 一个信封数n 输出格式: 一个整数,代表有多少种情况. 输入输出样例 输入样例#1: 样例1:2 样例2:3 输出样例#1: 样例1:1 样例2:2 题解: 错位排列 本题解用的是f(n)=(n-1)*(f(n-1)+f(n-2)) 这道题的另一个公式 ans=n!(1-1/1!+1/2!-1/3!+...+(-1)^n*(1/n

5.30杂题选讲

前三题为水题,后面两题更有意思. 然而代码全都咕咕咕了,也许以后会补. Hdu1520 Anniversary party 简单树形DP. Hdu6386 Age of Moyu 简单最短路. bzoj3679 数字之积 简单数位DP. CF Gym 101482G Gathering 首先对于每个点,可行的区域显然是个矩形,那么可以先对这些矩形求交,得到合法区域. 如果不考虑限制,那么最优点显然是\(x,y\)的中位数. 考虑限制之后,只要定下\(x\),那么最优的\(y\)也是确定的. 而且

「总结」杂题选讲

Bitwise Xor 我们可以发现一个序列中的最小的异或值是两个大小相邻的数的\(xor\)取\(min\). 那么我们对序列排序. 只需要计算相邻的\(xor\)是大于等于\(k\)的方案. \(dp[i]\)是以\(i\)结尾最小\(xor\)大于\(K\)的方案. 然后我们可以类似于用树状数组来搞最长升降转移. 这次用\(trie\)来转移. MOD Problem 大水题 \[\begin{aligned} ans&=\sum\limits_{i=1}^{n}n\ mod\ I\&

ZROI 19.08.02 杂题选讲

给出\(n\)个数,用最少的\(2^k\)或\(-2^{k}\),使得能拼出所有数,输出方案.\(n,|a_i|\leq 10^5\). 显然一个绝对值最多选一次.这个性质非常强. 如果所有都是偶数,可以直接除以\(2\). 否则\(1\)或\(-1\)必须选,暴力枚举选哪个然后递归,每层去重,发现最多只会递归\(\log a\)次.总复杂度\(O((n+a)\log n)\),等价于线段树上区间长度总和. \(n\)个数,每次可以花费\(1\)的代价给某个数\(+1\)或\(-1\),问变成不

20190915杂题选讲

T1 设\(b_1=p_1^{a_1}p_2^{a_2}-p_n^{a_n}\),显然答案最大为\(\sum a_i\) 考虑让\(\sum a_i\)最大,那\(b_1\)不能有有超过5的质因子,因为\(2^2<5\).3的个数最多也只有一个,因为\(2^3<3^2\) 于是就可以dp,设\(f[i][j][k]\)表示填到第i个数,gcd可以表示为\(2^j3^k\)的答案,分类讨论转移一下,最后答案为\(f[n][0][0]\) code: #include <bits/stdc+

hdu 1465(不容易系列之一)(水题,错排公式)(a[n]=(n-1)*(a[n-1]+a[n-2]))

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14924    Accepted Submission(s): 6207 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总

AcWing 230. 排列计数 水题(组合数+错排)打卡

题目:https://www.acwing.com/problem/content/232/ #include<bits/stdc++.h> #define ll long long #define mod 1000000007 using namespace std; const int maxn = 1000005; ll dp[maxn],inv[maxn],fac[maxn],inv_fac[maxn]; void init() { inv[0]=inv[1]=inv_fac[0]=f