洋葱矩阵
时间限制:1秒 内存限制:128M
题目描述
小可想到了一种像洋葱一样一层一层地填充矩阵的方法,如下图:
从1开始如图填充。现在小可想要考考你,给你一个数k,需要你计算出这个数在矩阵中的坐标是多少。
矩阵中,
1的坐标为(1,1),
2的坐标为(1,2),
3的坐标为(2,2),…
输入描述
第一行一个正整数
t(1≤t≤100),代表小可问了t次。
每次询问,小可给出一个正整数
k(1≤k≤10^9)。
输出描述
对于小可的每次询问,输出k在矩阵中的坐标。
样例输入
7
11
14
5
4
1
2
1000000000
样例输出
2 4
4 3
1 3
2 1
1 1
1 2
31623 14130
这是我的代码
#include<bits/stdc++.h>
using namespace std;
int a[100005];
const int N=1e9+1;
void algorithm(){
long long sum=0;
for(int i=1,j=1; ;i+=2,j++){
a[j]=i;
sum+=i;
if(sum>=N){
break;
}
}
}
int main(){
algorithm();
int t;
cin>>t;
while(t--){
int k;
cin>>k;
int ans=0,cnt=0,flag=1;
for(int i=1; ; i++){
cnt+=a[i];
if(cnt==k){
ans++;
break;
}
if(cnt>k){
flag=k-(cnt-a[i]);
ans++;
break;
}
ans++;
}
int x,y;
if(flag>=a[ans]/2+1){
x=ans;
y=a[ans]-flag+1;
}
else{
x=flag;
y=ans;
}
cout<<x<<" "<<y<<endl;
}
return 0;
}
只能得50.00000000001
咋改啊