题目描述

牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因,其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。

输入描述:


每个输入包含一个测试用例。每个测试用例的第一行包含两个整数 n 和 k(1 <= n <= 100, 0 <= k <= 1000000000),接下来的 1 行,包含 n 个数字表示排列 A,其中等于0的项表示看不清的位置(不超过 10 个)。


输出描述:


输出一行表示合法的排列数目。


示例1

输入


5 5 4 0 0 2 0


输出


2


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool Judge(vector<int> Input,int k){
int Result = 0;
for(int i = 0;i < Input.size();i ++){
for(int j = i + 1;j < Input.size();j ++){
if(Input[i] < Input[j]){
Result++;
}
}
}
return (Result == k);
}
int main(){
int n,k;vector<int> Input;
int Result = 0;
cin >> n >> k;
vector<int> NewInput(n);
vector<int> NoExistArray;
for(int i = 0;i < n;i ++){
int tmp;
scanf("%d",&tmp);
Input.push_back(tmp);
}
for(int i = 1;i <= n;i ++){
if(find(Input.begin(),Input.end(),i) == Input.end()){
NoExistArray.push_back(i);
}
}
int NoExistNum = NoExistArray.size();
vector<int> Index(NoExistNum);
for(int i = 0;i < NoExistNum;i ++){
Index[i] = i;
}
do{
int index = 0;
for(int i = 0;i < Input.size();i ++){
if(Input[i] > 0){
NewInput[i] = Input[i];
}
else if(Input[i] == 0){
NewInput[i] = NoExistArray[Index[index++]];
}
}
if(Judge(NewInput,k)){
Result ++;
}
}while(next_permutation(Index.begin(),Index.end()));
printf("%d\n",Result);
return 0;
}