View Code of Problem 3601

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int flag,n,K,ans,A[110000],num;
void check(int L,long long K){
	if (K==0){
		for (int i=1;i<=L;i++) A[++num]=1;
		return;
	}
	int l=1,r=L+1,ans;
	while (l<r){
		int mid=l+r>>1;
		if (1ll*mid*(mid-1)<=K){
			ans=mid; l=mid+1;
		} else r=mid;
	}
	int mid=ans;
	while (K>=1ll*(mid-1)*mid){
		K-=1ll*(mid-1)*mid; L-=mid; A[++num]=mid;
	}
	check(L,K);
}		
int main(){
//	freopen("data.in","r",stdin);
//	freopen("dataa.out","w",stdout);
	while (scanf("%d",&K)!=EOF){
		int l=0; num=0;
		if (K<=100000){
			cout<<K<<endl; for (int i=1;i<=K;i++) printf("1 "); cout<<endl; continue;
		}
		while (l*(l+1)<K*2) l++; check(l,1ll*l*(l+1)-K*2); printf("%d\n",l);
		for (int i=1;i<=num;i++) for (int j=1;j<=A[i];j++) printf("%d ",i); cout<<endl;
	}
	return 0;
}

Double click to view unformatted code.


Back to problem 3601