Hdu 5334 Virtual Participation (構造)

解析:

首先找到第一個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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章