Codeforces 888D Almost Identity Permutations:错排公式

Posted Leohh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 888D Almost Identity Permutations:错排公式相关的知识,希望对你有一定的参考价值。

题目链接:http://codeforces.com/problemset/problem/888/D

题意:

  给定n,k,问你有多少种1到n的排列,满足至少有n-k个a[i] == i。

  (4 <= n <= 1000, 1 <= k <= 4)

 

题解:

  转换题意:

    给定n,k,问你有多少种1到n的排列,满足最多有k个a[i] != i。

  D(i)表示1到i的排列的错排方案数。

  那么ans = ∑(C(n,i) * D(i)) + 1,其中i∈[2,k]。

  ps:

    错排递推式:D(n) = (n-1) * (D(i-1)+D(i-2))

    错排通项式:D(n) = n! * ∑(((-1)^i) / i!),其中i∈[2,n]

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 using namespace std;
 6 
 7 long long n,k;
 8 long long ans=1;
 9 
10 int main()
11 {
12     cin>>n>>k;
13     if(k>=2) ans+=n*(n-1)/2;
14     if(k>=3) ans+=2*n*(n-1)*(n-2)/6;
15     if(k>=4) ans+=9*n*(n-1)*(n-2)*(n-3)/24;
16     cout<<ans<<endl;
17 }

 

以上是关于Codeforces 888D Almost Identity Permutations:错排公式的主要内容,如果未能解决你的问题,请参考以下文章

codeforces 863F Almost Permutation

CodeForces 915D Almost Acyclic Graph

C. Almost Equal ( Codeforces Round #580 (Div. 2) )

Almost Acyclic Graph CodeForces - 915D (思维+拓扑排序判环)

D - Almost Identity Permutations /* Codeforces Round 888 D */

Codeforces 915D Almost Acyclic Graph