标题:螺旋折线
如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?
【输入格式】
X和Y
对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000
【输出格式】
输出dis(X, Y)
【样例输入】
0 1
【样例输出】
3
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
分析:如果再添一条直线y=-x,就可以看出其实这是两个相似三角形。
可观察到左下角的左单边的长度依次为 1 3 5 7 ·······,下单边的长度依次为 1 3 5 7 ·······
右上角右单边的长度为 2 4 6 8 ·······,上单边的长度为 2 4 6 8 ·······
所以从第一个三角形到第n个三角形,左下角的三角形单边的边长和为(n*n):由等差数列和得到,右上角的三角形一边的边长和为(n*n+n)由等差数列和得到。
此外,定点所在的单边上,经过的长度需要单独计算,注意x,y的正负就行。
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
long long x,y,sum;
scanf("%lld%lld",&x,&y);
if(y>=x&&y>=(-x))//点在上边
{
sum=y+x+2*y*y+2*((y-1)*(y-1)+(y-1));
}
else if(y<x&&y>=(-x))//点在右边
{
sum=x-y+(x-1)*(x-1)+x-1+2*(x*x)+x*x+x;
}
else if(y<=x&&y<=(-x))//点在下边
{
sum=-x-y+2*((-y)*(-y)-y)+2*((-y)*(-y));
}
else//点在左边
{
sum=y-x-1+(-x-1)*(-x-1)+(-x)*(-x)+2*((-x-1)*(-x-1)+(-x-1));
}
printf("%lld\n",sum);
return 0;
}