思路:不得不说,公式是由我们大量推导产生的
由图可以发现,每行的开头都是当前行数得平方,所以对每个数据开根号后向上取整可获得当前是那行(哪列)
接下来就求具体的坐标
不难发现n–>每个数据开根号向上取整,k -->就是当前的原数据
n * n = 确定的行/列
n * n - k -->确定这条拐弯线的第几个
n * n - k >= n 在n列的x行确定坐标,坐标为 n - (n * n-k -n) - 1, n
n * n - k < n 在n行的x列确定坐标 坐标为 n,(n*n -k) + 1
主要意思:由下面的图片可知,让我们随便给个数,找出它的坐标,而且它的棋盘无限长,
AC代码
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
typedef long long LL;
/*
不得不说,公式是由我们大量推导产生的
由图可以发现,每行的开头都是当前行数得平方,所以对每个数据开根号后向上取整可获得当前是那行(哪列)
接下来就求具体的坐标
不难发现n-->每个数据开根号向上取整,k -->就是当前的原数据
n * n = 确定的行/列
n * n - k -->确定这条拐弯线的第几个
n*n - k >= n 在n列的x行确定坐标,坐标为 n - (n*n-k -n) - 1, n
n*n - k < n 在n行的x列确定坐标 坐标为 n,(n*n -k) + 1
*/
//printf("%f",sqrt(13));
int main()
{
int t;
scanf("%d",&t);
LL k;
while(t--)
{
scanf("%lld",&k);
int n = ceil(sqrt(k));
if(n * n - k >= n ){
printf("%d %d\n",n - (n*n -k - n) - 1, n);
}else{
printf("%d %d\n",n,(n*n - k) + 1);
}
}
return 0;
}