CF 615E Hexagons

来源:互联网 发布:dnf优化怎么这么差 编辑:程序博客网 时间:2024/05/13 03:17

题目大意

给定一个由六边形密铺组成的坐标系中的点的坐标规律。求从原点出发以六边形轨迹行走n步所走到的坐标(0 ≤ n ≤ 10^18)题目链接: http://codeforces.com/contest/615/problem/E

分析

很明显的找规律题了,我是直接求边长后分情况讨论在哪一条边上,代码写的很丑很长。(同时应该比较容易理解吧)思考:如果我们已知点的坐标,该如何求得走了多少步呢。这或许还能出一道有趣的题目。

代码

#include<cstdio>#include<cmath>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;}
0 0
原创粉丝点击