解析:
首先找到第一個n使得n*(n+1)/2>=k,差值爲x。
然後看下面一個例子:
28 = 1 2 3 4 5 6 7
27 = 1 1 3 4 5 6 7
26 = 1 1 3 3 4 5 6
25 = 1 1 1 4 5 6 7
24 = 1 1 1 4 4 6 7
23 = 1 1 1 4 4 6 6
22 = 1 1 1 4 4 4 7
21 = 1 2 3 4 5 6
對於x,不斷找<=x的最大的m*(m+1)-m,相見進行迭代至0。
注意4是特例。
[code]:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
int m,a[maxn],n;
int bin(int x){
int lb,rb,mid;
lb = 0,rb = n+1;
while(rb-lb>1){
mid = (lb+rb)>>1;
if(mid*(mid+1)/2-mid<=x) lb = mid;
else rb = mid;
}
return lb;
}
void sol(int p,int s){
if(s == 0) return;
int i,l = bin(s);
for(i = 1;i < l;i++){
a[p+i] = a[p];
}
sol(p+l,s-l*(l+1)/2+l);
}
int main(){
int i,j;
while(~scanf("%d",&m)){
if(m <= 1e5){
printf("%d\n",m);
for(i = 1;i <= m;i++){
if(i-1) putchar(' ');
putchar('1');
}
putchar('\n');
continue;
}
for(n = 1;;n++){
a[n] = n;
if(n*(n+1)/2>=m) break;
}
sol(1,n*(n+1)/2-m);
printf("%d\n",n);
for(i = 1;i <= n;i++){
if(i-1) putchar(' ');
printf("%d",a[i]);
}
putchar('\n');
}
return 0;
}