A. 【例题1】错排问题


题目描述

求多少个

n

n

n个数的排列

A

A

A ,满足对于任意的

i

(

1

i

n

)

i(1 ≤ i ≤ n)

i(1≤i≤n) 使

A

i

i

Ai ≠ i

Ai​=i 。


输入格式

一个整数 。


输出格式

一个整数,表示答案。


样例

  • 输入样例

2

  • 输出样例

1


数据范围与提示

对于

100

%

100\%

100%的数据,

1

n

20

1 ≤ n ≤ 20

1≤n≤20。


题目解析

首先这道题我们考虑递推;

首先,先以

f

(

1

)

=

0

,

f

(

2

)

=

1

f(1) = 0,f(2) = 1

f(1)=0,f(2)=1.(手推

1

,

2

1,2

1,2项您总会吧)
再从

3

3

3开始进行递推.

考虑从

n

n

n个数分别放在不同的位置有

n

n

n种方法,那么不放在原位就有

n

1

n-1

n−1种方法.
再考虑从

n

n

n中提取一个数

l

l

l.
考虑两种情况

  1. l

    l

    l放在原位上:那么除

    l

    l

    l外的

    n

    1

    n-1

    n−1个数的方法就为

    f

    (

    n

    2

    )

    f(n-2)

    f(n−2)
    (

    n

    1

    n-1

    n−1个数放在不同的位置,有

    n

    1

    n-1

    n−1种方法)

  2. 不把

    l

    l

    l放在原位上:那么对于剩余的

    n

    1

    n-1

    n−1个数就可以放在任何位,那么就是

    f

    (

    n

    1

    )

    f(n-1)

    f(n−1)种方法(同

    n

    n

    n个数分别放在不同的位置,不放在原位的就是

    l

    l

    l)

那么我们就很容易可以得出递推式:

f

(

i

)

=

{

f

(

1

)

=

0

f

(

2

)

=

1

f

(

i

)

=

(

n

1

)

(

f

(

n

1

)

+

f

(

n

2

)

)

(

i

>

2

)

f(i) = \left\{\begin{matrix} &~~~~~~~f(1) = 0~~~~~~~~~f(2) = 1~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \\ & f(i) = (n - 1) * (f(n-1)+f(n-2)) ~~~~~~~~~~~(i>2)\\ \end{matrix}\right.

f(i)={​       f(1)=0         f(2)=1                                                         f(i)=(n−1)∗(f(n−1)+f(n−2))           (i>2)​


Code

小小的提醒:

20

20

20的数据也要开

l

o

n

g

long

long

l

o

n

g

long

long

#include <cstdio>
#include <iostream>
#define ll long long
using namespace std; ll n, ans, a[25]; int main ()
{
scanf ("%lld", &n);
a[2] = 1;
for (int i = 3; i <= n; ++ i)
a[i] = (i - 1) * (a[i - 1] + a[i - 2]);
printf ("%lld", a[n]);
return 0;
}

最新文章

  1. 用Python生成测试数据
  2. 使用 apache2 + `mod_proxy_uwsgi` + uwsgi + upstart 部署
  3. invalidate()和postInvalidate()的使用与区别
  4. PhoneGap(二维码扫描 )
  5. [转载]localhost与127.0.0.1的区别
  6. 《The Book of CSS3》学习笔记
  7. 小白学数据分析-----&gt;ARPDAU的价值
  8. VC调用系统的调色板
  9. MTK6577+Android4.04编译
  10. android利用剪切板来实现数据的传递
  11. Linux kernel ‘net/key/af_key.c’信息泄露漏洞
  12. Python 自动化脚本学习(三)
  13. Tree(prime)
  14. Velocity脚本新手教程
  15. python新手 实践操作 作业
  16. 单台PC玩转NEUTRON(一:环境准备)
  17. 定制kickstart重建CentOS7.5镜像用于U盘引导安装
  18. volatile(一)
  19. Unix.Trojan.DDoS_XOR-1木马症状及清理办法
  20. Docker 镜像操作

热门文章

  1. funny 生成器
  2. SHON WEBB:太怀念过去的人,往往走不远
  3. HashMap什么时候进行扩容?
  4. 看完我的笔记不懂也会懂----MongoDB
  5. 后端程序员之路 25、Redis Cluster
  6. LeetCode392. 判断子序列
  7. ZooKeeper未授权访问漏洞确认与修复
  8. Semaphore实战
  9. 设计模式之抽象工厂模式(Abstract Factory Pattern)
  10. C语言之结构体内存的对齐