jzoj 3736. 數學題

Description

這裏寫圖片描述

Input

輸入有多組測例,每組測例有一行,爲4 個整數x1,y1, x2, y2,含義見題目描述。輸入文件以EOF 結束。

Output

這裏寫圖片描述

Sample Input

3 0 1 2
6 0 4 0

Sample Output

5
0

Data Constraint

這裏寫圖片描述

解題思路

來自 歐幾里得算法的應用 江蘇省常州高級中學 金斌
這裏寫圖片描述這裏寫圖片描述這裏寫圖片描述這裏寫圖片描述


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>

#define ll long long
#define sqr(x) ((x)*(x))

using namespace std;

ll x,y,xx,yy;

void gcd(ll x,ll y,ll xx,ll yy,ll &n,ll &m)
{
    ll dj,len1,len2;
    dj=x*xx+y*yy;
    len1=sqr(x)+sqr(y);
    len2=sqr(xx)+sqr(yy);
    //printf("%lld %lld %lld %lld %lld %lld %lld\n",x,y,xx,yy,len1,len2,dj);
    if (len1>len2)
    {
        gcd(xx,yy,x,y,m,n);
        return;
    }
    if (dj<0)
    {
        gcd(x,y,-xx,-yy,n,m);
        m=-m;
        return;
    }
    if (4*sqr(dj)<=len1*len2) {n=1; m=0; return;}
    ll k;
    k=dj/len1;
    if (2*dj<(2*k+1)*len1) 
    {
        gcd(x,y,xx-k*x,yy-k*y,n,m);
        n-=k*m;
        return;
    }
    else
    {
        gcd(x,y,xx-(k+1)*x,yy-(k+1)*y,n,m);
        n-=(k+1)*m;
        return;
    }
}

ll n,m;

int main()
{
    freopen("math.in","r",stdin);
    freopen("math.out","w",stdout);
    while (~scanf("%lld%lld%lld%lld",&x,&y,&xx,&yy))
    {
      gcd(x,y,xx,yy,n,m);
      printf("%lld\n",sqr(n*x+m*xx)+sqr(n*y+m*yy));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章