#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.