可以发现坐标都是一圈一圈的,每圈多走六步。
然后每条边的坐标变换规律,找一找就可以了。
所以先二分找到x轴上的那个最外圈的特殊点,再往回模拟就行了。
具体看代码,很好懂。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
const int MAXN = 10010;
const int INF=1000000007;
typedef long long ll;
ll n;
int main(){
cin>>n;
if(n==0){
printf("0 0\n");
return 0;
}
ll r=1000000000;
ll l=0;
while(r-l>1){
ll m=(r+l)>>1;
if(3*m*(m+1)<n){
l=m;
}
else{
r=m;
}
}
ll x=r*2,y=0;
ll t=3*r*(r+1)-n;
int flag=0;
while(t){
if(t<r){
switch(flag){
case 0:
x-=t;
y-=2*t;
flag=1;
break;
case 1:
x-=2*t;
flag=2;
break;
case 2:
x-=t;
y+=2*t;
flag=3;
break;
case 3:
x+=t;
y+=2*t;
flag=3;
break;
case 4:
x+=2*t;
flag=5;
break;
case 5:
x+=t;
y-=2*t;
flag=0;
break;
}
break;
}
switch(flag){
case 0:
x-=r;
y-=2*r;
flag=1;
break;
case 1:
x-=2*r;
flag=2;
break;
case 2:
x-=r;
y+=2*r;
flag=3;
break;
case 3:
x+=r;
y+=2*r;
flag=4;
break;
case 4:
x+=2*r;
flag=5;
break;
case 5:
x+=r;
y-=2*r;
flag=0;
break;
}
t-=r;
}
cout<<x<<" "<<y<<endl;
}