题意:给你k个数字,输出数字1-k的全排列的从小到大第n个数字的排序,n=∑Si ∗ (K − i)!+1
思路:一开始感觉有点无从下手,因为n是很大的,直接算几乎不太可能。然后放了两天,今天再看,突然间有灵感,
首位确定,后面的(k-1)个数的全排列正好有(k-1)!个,首位是第si小的数的全排列的和正好是(si*(k-1)!),以此类推
每次找区间的第(si+1)小的数,
然后用vector处理就很方便了
代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,m,a[50005];
int main()
{
scanf("%d",&t);
while(t--)
{
vector<int>v;
v.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
v.push_back(i);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
printf("%d",v[a[i]]);
if(i!=n) printf(" ");
else printf("\n");
v.erase(v.begin()+a[i]);
}
}
}