Cod sursa(job #1372858)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 4 martie 2015 15:37:23
Problema Multimi2 Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>
inline long long gauss(int x){
    return (x*(long long)(x+1))/2LL;
}
int main(){
    int n, rez, pas, dif, a, i;
    FILE *fin, *fout;
    fin=fopen("multimi2.in", "r");
    fout=fopen("multimi2.out", "w");
    fscanf(fin, "%d", &n);
    rez=0;
    for(pas=1<<19; pas!=0; pas>>=1){
        if((2*gauss(rez+pas)<=gauss(n))){
            rez+=pas;
        }
    }
    fprintf(fout, "%d\n", (gauss(n)-2*gauss(rez))%2);
    dif=(gauss(n)-2*gauss(rez));
    if(dif>(gauss(n)-2*gauss(rez))%2){
        dif/=2;
        a=n;
        while(a-dif>rez){
            a--;
        }
        fprintf(fout, "%d\n", rez);
        for(i=1; i<a-dif; i++){
            fprintf(fout, "%d ", i);
        }
        for(i=a-dif+1; i<=rez; i++){
            fprintf(fout, "%d ", i);
        }
        fprintf(fout, "%d\n%d\n", a, n-rez);
        for(i=rez+1; i<a; i++){
            fprintf(fout, "%d ", i);
        }
        for(i=a+1; i<=n; i++){
            fprintf(fout, "%d ", i);
        }
        fprintf(fout, "%d\n", a-dif);
    }else{
        fprintf(fout, "%d\n", rez);
        for(i=1; i<rez; i++){
            fprintf(fout, "%d ", i);
        }
        fprintf(fout, "%d\n%d\n", i, n-rez);
        for(i=rez+1; i<n; i++){
            fprintf(fout, "%d ", i);
        }
        fprintf(fout, "%d\n", i);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}