2022 CCPC 桂林 E

E. Draw a triangle

题链
不难发现可以用叉积来求
我们假设A指向B的向量为(-b,a) 注意这里是 -b a
假设A指向C的向量为(x,y)
题目给出了AB坐标 我们就知道了第一个向量 我们只需要求x,y这个向量就可以了
S=1/2(ax+by)这里面就是一个线性同余了 他的最小值为gcd(a,b)
我们只需要exgcd求出一组x y即可
要是a b为负数也没关系 我们可以先给系数
(-1)就可以了
最后再加上x1 y1即可
最后的最后记得特判ab为0的情况

void exgcd(int a,int b,int &x,int &y){
    if(!b){x=1,y=0;return;}
    else {exgcd(b,a%b,y,x),y-=a/b*x;}
}
void solve(){
    int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;
    if(x1==x2){
        cout<<x1+1<<" "<<y1<<endl;
        return;
    }
    if(y1==y2){
        cout<<x1<<" "<<y1+1<<endl;
        return;
    }
    int a=y2-y1,b=x1-x2;
    int x,y,sx=1,sy=1;
    if(a<0){
        a=-a;
        sx=-1;
    }
    if(b<0){
        b=-b;
        sy=-1;
    }
    exgcd(a,b,x,y);
    cout<<x1+x*sx<<' '<<y1+y*sy<<endl;
}
posted @ 2022-12-05 01:19  ycllz  阅读(58)  评论(0)    收藏  举报