题解:第n个球在第几堆第几行第几个
思路:a[i]保存第i堆个数,b[i]表示前i堆个数,再二分查找对应位置.
#include<stdio.h>
#include<string.h>
#define MAX 2000000
long long a[MAX];
long long b[MAX];
long long n,x;
void Init(){
int i;
a[1]=1;
b[1]=1;
for(i=2;i<MAX;i++){
a[i]=a[i-1]+i;
b[i]=a[i]+b[i-1];
}
return ;
}
int main(){
int i,j,t;
long long s,m,e;
Init();
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
s=0;e=MAX;
m=(s+e)/2;
while(1){
if(b[m]>=n&&b[m-1]<n)break;
if(b[m]>=n){
if(m==e)m--;
e=m;
m=(s+e)/2;
}
else{
if(s==m)m++;
s=m;
m=(s+e)/2;
}
}
printf("%lld ",m);
x=n-b[m-1];
s=0;e=m;
m=(s+e)/2;
while(1){
if(a[m]>=x&&a[m-1]<x)break;
if(a[m]>=x){
if(e==m)m--;
e=m;
m=(s+e)/2;
}
else{
if(s==m)m++;
s=m;
m=(s+e)/2;
}
}
printf("%lld %lld\n",m,x-a[m-1]);
}
return 0;
}