题目大意
给定一个由六边形密铺组成的坐标系中的点的坐标规律。求从原点出发以六边形轨迹行走n步所走到的坐标
(0 ≤ n ≤ 10^18)
题目链接: http://codeforces.com/contest/615/problem/E
分析
很明显的找规律题了,我是直接求边长后分情况讨论在哪一条边上,代码写的很丑很长。(同时应该比较容易理解吧)
思考:如果我们已知点的坐标,该如何求得走了多少步呢。这或许还能出一道有趣的题目。
代码
long long n,x,y,i,m,t;
int main(){
scanf("%I64d",&n);
if (n==0){
printf("0 0\n");
return 0;
}
m=n/3;
m=int(sqrt(m));
while (1){
t=3*m*(m+1);
if (t<=n)
break;
m--;
}
while (1){
t=3*(m+1)*(m+2);
if (t>n)
break;
m++;
}
i=m+1;
t=3*m*(m+1);
n-=t;
x=2*m;
if (n==0){
printf("%I64d 0\n",x);
return 0;
}
x+=1;
y+=2;
if (n<=i){
x-=n-1;
y+=(n-1)*2;
printf("%I64d %I64d\n",x,y);
return 0;
}
else {
n-=i;
x-=i-1;
y+=(i-1)*2;
}
x-=2;
if (n<=i){
x-=(n-1)*2;
printf("%I64d %I64d\n",x,y);
return 0;
}
else {
n-=i;
x-=(i-1)*2;
}
x-=1;
y-=2;
if (n<=i){
x-=n-1;
y-=(n-1)*2;
printf("%I64d %I64d\n",x,y);
return 0;
}
else {
n-=i;
x-=i-1;
y-=(i-1)*2;
}
x+=1;
y-=2;
if (n<=i){
x+=n-1;
y-=(n-1)*2;
printf("%I64d %I64d\n",x,y);
return 0;
}
else {
n-=i;
x+=i-1;
y-=(i-1)*2;
}
x+=2;
if (n<=i){
x+=(n-1)*2;
printf("%I64d %I64d\n",x,y);
return 0;
}
else {
n-=i;
x+=(i-1)*2;
}
x+=1;
y+=2;
if (n<=i){
x+=n-1;
y+=(n-1)*2;
printf("%I64d %I64d\n",x,y);
return 0;
}
else {
n-=i;
x+=i-1;
y+=(i-1)*2;
}
return 0;
}