Zhao_daodao
2024-11-14 21:51:43
答案就是
这一些数显然满足条件。
因为
当前
把
设每一个组的数量为
那么当前的答案就是:
每一个数可以取
每一次二分出当前的最大的
打表发现,每一个 1
有非常大的用处。
因为 1
。
每一个 1
都能跟后面的所有数产生贡献,所以当前的贡献为:
后面的
如果你取到当前最大的
也就是,
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2.5e5+5;
int n,k;
inline int S(int x){
return (2*n-1-x)*x/2;
}
inline int C2(int x){return x*(x-1)/2;}
int ans[MAXN];
inline void solve(){
int x=0;
for(int i=0;i<=n;i++){
if(S(i)<=k&&S(i+1)>k){
k-=S(i);x=i;break;
}
}
for(int i=1;i<=x;i++)ans[i]=1;
int cnt=2*n-1,lin=x+1;
while(k>0){
int l=1,r=n,del=1;
while(l<=r){
int mid=l+r>>1;
if(C2(mid)<=k){
l=mid+1,del=mid;
}else r=mid-1;
}
k-=C2(del);
for(int i=lin;i<=lin+del-1;i++)ans[i]=cnt;
lin+=del;cnt--;
}
if(lin<=n){
for(int i=lin;i<=n;i++)ans[i]=cnt,cnt--;
}
for(int i=1;i<=n;i++)cout<<ans[i]<<" ";cout<<"\n";
}
signed main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
cin>>n>>k;solve();
}