#include<vector>
#include<iostream>
using namespace std;
typedef struct {
int tip, flag;
}myflag;
int create();
int factorial(int n);
void 输入();
int search(int m, vector<int>& n);
int another_search(int m, vector<int>& n);
int main()
{
cout << create()<< endl;
输入();
system("pause");
}
int create()
{
vector<int> flag;
int num = 0;
cin >> num;
for (int i = 0; i < num; i++)
flag.push_back(i + 1);
int mid = 0;
int total = 0;
for (int i = 0; i < num; i++)
{
cin >> mid;
total += (another_search(mid, flag) * factorial(num - i - 1));//康拓展式的表达式
}
return total + 1;
}
int factorial(int n)
{
//求阶乘
if (n == 0)
return 1;
else if (n < 0)
return -1;
else
{
int mid = 1;
for (int i = 0; i < n; i++)
mid *= (i+1);
return mid;
}
}
void 输入()
{
int x, y;//x代表排列组合的大小,y代表其在排列组合中的位置
cin >> x >> y;
vector<int> flag;
for (int i = 0; i < x; i++)
flag.push_back(i + 1);//设置标志数组
y--;
int myfactorial = 0;
for (int i = x - 1; i >= 0; i--)
{
myfactorial = factorial(x - 1);
cout << search(y / myfactorial,flag) << " ";
y = y & (myfactorial - 1);//取余数
}
}
int search(int m, vector<int>& n)
{
//寻找最小的数字
int flag = 0;
for (int i = 0; i < n.size(); i++)
{
if (m == 0)
{
//用于寻找没有被使用过的数据中第一小的数据
if (n[i] != 0)
{
flag = n[i] - 1;
break;//找到后就结束循环
}
continue;//避免flag的滥加
}
else if (flag == m && n[i] != 0)
break;
flag++;
}
n[flag] = 0;
return flag + 1;
}
int another_search(int m, vector<int>& n)
{
//寻找出未被使用过的第n小的数据
int flag = 0;
for (int i = m - 1; i >= 0; i--)
if (n[i] != 0&&n[i]<n[m-1])
flag++;
n[m - 1] = 0;
return flag;
}
康拓展开式的学习
最新推荐文章于 2024-05-02 21:46:15 发布