View Code of Problem 3688

#include<stdio.h>
#include<math.h>
//第x堆最后一个数字是x(x+1)(x+2)/6
//第x-1堆为(x^3-x)/6
int main()
{
    int tc;
    long long x;
    scanf("%d",&tc);
    while(tc--){
        scanf("%lld",&x);
        long long  p=(long long)pow(x*6.0,1.0/3);//p代表堆数
        p++;
        while((p*p*p-p)>=x*6.0)//当p较小时会需要
            p--;
      //  printf("%lld",p);
        x-=(p*p*p-p)/6;

        //同理找出层数
        long long k=(long long)(sqrt(2.0*x));
        k++;
        while(k*(k+1)/2>=x)
            k--;

        //根据计算减去前面的数目得到最后的列数
        x-=k*(k+1)/2;
        printf("%lld %lld %lld\n",p,k+1,x);
    }
    return 0;
}

Double click to view unformatted code.


Back to problem 3688