排列长度有保证,就是构造出的排列方案数不对
求调
#include<bits/stdc++.h>
//#include "perm.h"
#define ll long long
using namespace std;
#include <vector>
std::vector<int> construct_permutation(ll);
ll q,m,n,a[200],b[200],h[200],ht,f[200];
vector<int>vec;
void ins(ll p,ll x)
{
for(ll i=198;i>=p;i--) a[i+1]=a[i];
a[p]=x;
}
ll sub(ll i)
{
return 200-i*2+1;
}
vector<int> construct_permutation(ll m)
{
vec.clear();
for(ll i=0;i<200;i++) a[i]=b[i]=h[i]=0;
ll tmp=log2(m);
for(ll i=0;i<tmp;i++) a[tmp-i]=200-i*2;
ll cnt=0;
for(ll i=tmp-1;~i;i--)
if(m&(1ll<<i))
{
if(i==0)
{
ins(1,1e9);
}
else if(m&(1ll<<i-1))
{
if(cnt<2)
{
++cnt;
ins(1,sub(i));
}
else
{
ins(3,sub(i-1));
--i;
}
}
else
{
ins(1,sub(i));
}
}
n=ht=0;
for(ll i=1;i<200;i++)
if(a[i]) b[++n]=a[i], h[n]=a[i];
sort(h+1,h+1+n);
for(ll i=1;i<=n;i++)
vec.push_back(lower_bound(h+1,h+1+n,b[i])-h-1);
return vec;
}
//int main()
//{
// ll q;
// scanf("%lld",&q);
// while(q--)
// {
// ll m;
// scanf("%lld",&m);
// vector<int>vec=construct_permutation(m);
// ll s=0;
// printf("%lld ",vec.size());
// for(ll i=0;i<vec.size();i++)
// {
// f[i]=1;
// for(ll j=0;j<i;j++)
// if(vec[j]<vec[i]) f[i]+=f[j];
// s+=f[i];
// printf("%lld ",vec[i]);
// }
// printf("\n");
//// if(s+1==m) printf("YES\n");
//// else printf("NO\n");
// }
// return 0;
//}