题目链接

https://www.luogu.org/problem/P1595

题目描述

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

输入格式

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

输出格式

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

思路如下

n封信放进n个信封,总的方案数 = n!

令F(n)为n封信放入n个信封全放错的方案数,则n封信中有m个信封放错的方案数为:

C(m,n)×F(m)

其中C(m,n)为从n封信中选出m个放错的信和信封的方案数,F(m)为m个信全部放错信封的方案数。

n封信放进n个信封,总的方案包含以下方案:

0封信放错信封 方案数 = F(0)=1

2封信放错信封 方案数 = C(2,n)×F(2)

3封信放错信封 方案数 = C(3,n)×F(3)

4封信放错信封 方案数 = C(4,n)×F(4)

· · · · · ·

n封信放错信封 方案数 = F(n)

∴F(0)+ C(2,n)×F(2)+ ···+C(n-1,n)×F(n-1)+F(n)=n!

∴F(n)=n! - F(0)- C(2,n)×F(2)+ ···+C(n-1,n)×F(n-1)

即只要已知 F(0)、F(2)···、F(n-1),即可求得F(n)。推导到这里,这道题就可以用递推了:

由F(0)、F(2)、F(3)求得F(4),再由F(0)、F(2)、F(3)、F(4)求得F(5),再由这些求得F(6)······直到求得F(n)。

代码如下:

#include<bits/stdc++.h>
#include<math.h>
#include<algorithm>
using namespace std;
long long fac(int x)
{
register int i;
long long f = ; for (i = ;i <= x;i++)
f *= i; return f;
}
int f(int m, int n)
{
int i, j;
int ans = ;
if (m < n - m) m = n - m;
for (i = m + ; i <= n; i++) ans *= i;
for (j = ; j <= n - m; j++) ans /= j;
return ans;
}
int main()
{
int i, j, n, a[],b=,c;
cin >> n;
if (n == ) cout << ;
else
{
a[] = ;a[] = ;
for (i = ;i <= n - ;i++)
{
b = ;
c = ;
for (j = i - ;j >= ;j--)
{
b += f(c, i + )*a[j - ];
c++;
}
a[i - ] = fac(i + ) - b - ;
}
cout << a[n - ];
}
return ;
}

洛谷【P1595 信封问题】 题解的更多相关文章

  1. 洛谷P1595 信封问题 题解 错排问题

    作者:zifeiy 标签:排列组合,错排问题 题目链接:https://www.luogu.org/problem/P1595 题目描述:某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都 ...

  2. 洛谷——P1595 信封问题

    P1595 信封问题 题目描述 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都装错信封共有多少种不同情况. 输入输出格式 输入格式: 一个信封数n(n<=20) 输出格式: 一个 ...

  3. 洛谷P1595 信封问题

    题目描述 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都装错信封共有多少种不同情况. 输入输出格式 输入格式: 一个信封数n 输出格式: 一个整数,代表有多少种情况. 输入输出样例 输 ...

  4. 洛谷 P1595 信封问题

    题目描述 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都装错信封共有多少种不同情况. 输入输出格式 输入格式: 一个信封数n 输出格式: 一个整数,代表有多少种情况. 输入输出样例 输 ...

  5. 错排问题 && 洛谷 P1595 信封问题

    传送门 一道裸的错排问题 错排问题 百度百科上这样说 就是对于一个排列,每一个数都不在正确的位置上的方案数.n 个元素的错排数记为 D(n). 公式 D(n)=(n−1)∗(D(n−2)+D(n−1) ...

  6. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  7. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  8. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  9. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  10. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

随机推荐

  1. angularJS 传参的四种方法

    AngularJS - Passing data between pages 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Ye Huang链接:https://www.z ...

  2. T1飞跃树林 && 【最长等差子序列】

    solution by Mr.gtf 一道简单的递推 首先我们对树高从大到小排序 很容易得到递推式 ans[i]=Σans[j] (j<i && h[j]-h[i]<=K) ...

  3. 解释为什么不能依赖fail-fast

    我的观点fail-fast是什么就不多解释了,应该注意到的是(以ArrayList为例):modCount位于AbstractList中, protected transient int modCou ...

  4. mount.nfs: Stale file handle的解决方法

    在NFS客户端挂载rpc共享服务的时候出现这个问题 # mount -t nfs 192.168.20.6:/data /mnt mount.nfs: Stale file handle 原因是当cl ...

  5. Mysql 在线新建或重做主从

    1. 前言 以前给 Mysql 数据库做主从,都是在主服务器停服的情况下做的.但是最近有一个项目,已经上线几天了,数据库也单服务器跑了几天,才确定要给 Mysql 服务器做一个主从架构,简单的一主一从 ...

  6. vue element 表头添加斜线

    <template> <div class="app-container"> <el-table :data="tableData3&quo ...

  7. Linux监控-历史细项数据回溯

    Linux监控数据回溯 网络服务监控 应用场景: lvs 后端内网端机器网络波动监控: nginx 80.443端口连接监控: mysql 连接监控 以上为抛砖引玉,根据环境安装到监控工具(open ...

  8. Mysql 字符串转数字类型

    使用场景: 在数据库中进行数字比较,但是数字的存储格式是varchar的时候可以使用以下方法进行转换,然后进行比较 方法一:SELECT CAST('123' AS SIGNED); 方法二:SELE ...

  9. linux中网络命令

    write 解释 命令名称:write 命令所在路径:/usr/bin/write 执行权限:所有用户 功能描述:给用户发信息,以Ctrl+D保存结束 语法 write <用户名> 示例 ...

  10. linux 命令行下设置代理

    当linux 代理软件设置好后,我们需要设置命令行代理的连接方式,这样在命令行中的软件才能使用: 设置http/https代理: export https_proxy="127.0.0.1: ...