【NOI2014】數學題(math)

Description

這裏寫圖片描述

Solution

很明顯,如果兩個向量是反向的,那麼無論怎樣一定可以找到λ1,λ2 滿足相加爲0,剩下的部分要怎樣解決呢?這裏就要用到類歐幾里得算法,就是一種迭代過程很像歐幾里得算法的東東。
首先有第一個結論:若向量ab 的夾角π2 時,答案就是min(|a|,|b|)
Proof.
p=|a|,q=|b|,pq ,同時cosα12
則有|aλ1+bλ2|=(pλ1)2+(qλ2)2+2pλ1qλ2cosα
(pλ1)2+(qλ2)22pλ1qλ2cosα
(|pλ1||qλ2|)2+pλ1qλ2
若是x=0y0 ,就有(|pλ1||qλ2|)2=|qλ2|2q2p2
若是y=0x0 ,就有(|pλ1||qλ2|)2=|qλ1|2p2
否則|pλ1||pλ2||p||q|p2
還有第二個結論:向量(a,b)(a,b+ka) ,其中k 爲整數。有了這一條,我們就可以讓兩個向量夾角不斷變大,進而達到夾角π2 ,然後直接求出答案。
Proof
|aλ1+bλ2| 爲答案.轉換後則有
|aλ1+bλ2|=|aλ1+bλ2+akλ2akλ2|=|a(λ1ky)+(b+ka)λ2|
此時我們考慮k 的取值,要分類討論。
這裏寫圖片描述
|OA||OE| 時,就有OABAOB ,我們就可以轉化成一個比較大的角度了。
|OA||OE| 時,就從BCDBDC 之中選一個較大角來轉化。
第三個結論max(BCDBDC)AOB
Proof
∠BCD=∠AOB+∠OBC
有了這些結論,我們就可以解決這道題目了,不過要細心處理分類的條件(我被一個long long的平方坑了很長時間)。此外還有一些計算時候的小技巧。

  1. 向量的數量積:|a||b|cosθ=x1x2+y1y2
  2. 判斷max(BCDBDC) :判斷E 的落點與CD 中點的關係。
  3. k 的計算:|a|2 (證明詳見這個博客

Code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define fo(i,a,b) for(i=a;i<=b;i++)
typedef long long ll;
ll x,y,xx,yy,ans1,ans2,ans;
ll dot,l1,l2,k; 
bool bz;
ll sqr(ll x){return x*x;}
void deal(ll x,ll y,ll xx,ll yy,ll &ans1,ll &ans2){
    ll dot=x*xx+y*yy,l1=sqr(x)+sqr(y),l2=sqr(xx)+sqr(yy);
    //if(l1==0){bz=1;return;}
    if(dot<0){
        deal(x,y,-xx,-yy,ans1,ans2);ans2=-ans2;
        return;
    }
    if(l1>l2){
        deal(xx,yy,x,y,ans2,ans1);
        return;
    }
    if(sqr(dot)*4<(l1*l2)|!l1){
        ans1=1,ans2=0;
        return;
    }
    ll k=dot/l1;
    if(2*dot>l1*(2*k+1)){
        deal(x,y,xx-(k+1)*x,yy-(k+1)*y,ans1,ans2);
        ans1-=(k+1)*ans2;
    }
    else{
        deal(x,y,xx-k*x,yy-k*y,ans1,ans2);
        ans1-=k*ans2;
    }
}
int main(){
    freopen("math.in","r",stdin);
    freopen("math.out","w",stdout);

    while(scanf("%lld%lld%lld%lld",&x,&y,&xx,&yy)!=EOF){
        ans=ans1=ans2=bz=0;
        deal(x,y,xx,yy,ans1,ans2);
        x*=ans1,y*=ans1,xx*=ans2,yy*=ans2;
        ans=sqr(x+xx)+sqr(y+yy);
        printf("%lld\n",ans);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章