codeforces 888D Almost Identity Permutations

D. Almost Identity Permutations
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

A permutation p of size n is an array such that every integer from 1 to n occurs exactly once in this array.

Let's call a permutation an almost identity permutation iff there exist at least n - k indices i (1 ≤ i ≤ n) such that pi = i.

Your task is to count the number of almost identity permutations for given numbers n and k.

Input

The first line contains two integers n and k (4 ≤ n ≤ 10001 ≤ k ≤ 4).

Output

Print the number of almost identity permutations for given n and k.

Examples
input
Copy
4 1
output
1
input
Copy
4 2
output
7
input
Copy
5 3
output
31
input
Copy
5 4
output
76

题意:给你n,k,问多少种排列满足有至少n-k个数字在原位置。

题解:直接错排,因为k只有4,所以组合数*错排个数即可。

代码:

#include <cstdio>  
#define ll long long
int n,k;  
ll C(int n,int k)  
{  
    ll ans=1;  
    for(int i=n;i>=n-k+1;i--) ans*=i;  
    for(int i=1;i<=k;i++) ans/=i;  
    return ans;  
}  
int main()  
{  
    while(scanf("%d%d",&n,&k)==2)  
    {  
        if(k==1) puts("1");  
        else if(k==2) printf("%I64d\n",C(n,2)+1);  
        else if(k==3) printf("%I64d\n",C(n,2)+1+C(n,3)*2);  
        else if(k==4) printf("%I64d\n",C(n,2)+1+C(n,3)*2+C(n,4)*9);  
    } 
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值