点击打开链接
题意:
有很多堆,每堆的数目都有一定的。
给你一个数n,求这个数是在第几堆的第几行的第几列,
每堆的数目1,2,4,....,n*(n+1)/2
前n堆的和(1*1+2*2+3*3+...n*n+1+2+3+..+n)/2=(n*n*n+3*n*n+2*n)/6
则前n-1堆的和(n-1)*(n-1)*(n-1)+3*(n-1)*(n-1)+2*(n-1)=(n*n*n-n)/6
所以要求第几堆,我们可以先将(n*6)开三次方,然后比较它与n*n*n-n的关系。
#include"stdio.h" #include"string.h" #include"math.h" typedef __int64 LL; LL n; int main() { int T; LL a,b,c; scanf("%d",&T); while(T--) { scanf("%I64d",&n); a=(LL)pow(n*6.0,1.0/3); a++; while(6.0*n<=(a*a*a-a))a--; n-=(a*a*a-a)/6; b=(LL)sqrt(2.0*n); b++; while(((b*(b+1))/2)>=n)b--; c=n-(b*(b+1))/2; printf("%I64d %I64d %I64d\n",a,b+1,c); } return 0; }