• 【BZOJ2299】向量(HAOI2011)-裴蜀定理


    测试地址:向量
    做法:本题需要用到裴蜀定理。
    注意到题目中给的8个向量,实际上只有4对,每对互为相反向量,那么有:
    A(a,b)+B(b,a)+C(a,b)+D(b,a)=(x,y)
    这个方程当且仅当有一组A,B,C,D均为整数的解时成立。
    把横纵坐标拆开,得到由下面两个方程得到的方程组:
    Aa+BbCaDb=x
    Ab+Ba+Cb+Da=y
    尝试消去A,得到一个方程:
    (b2a2)B2abC(a2+b2)D=bxay
    根据裴蜀定理,该方程有一组整数解当且仅当gcd(a2b2,a2+b2,2ab)|bxay
    用类似的思路消去B,C,D,和上面一个方程合起来得到4个方程,显然这4个方程组成的方程组和原方程组等价,那么新方程组有整数解的条件也就是原方程组有整数解的条件,于是我们就得到了4个条件,当且仅当这四个条件都满足时原方程组有整数解,否则就没有整数解。
    (据说这题提高难度……不会做的我是不是废了T_T)
    以下是本人代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int T;
    ll a,b,x,y;
    
    ll gcd(ll a,ll b)
    {
        if (a<0) a=-a;
        if (b<0) b=-b;
        return b?gcd(b,a%b):a;
    }
    
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            scanf("%lld%lld%lld%lld",&a,&b,&x,&y);
            ll d=gcd(gcd(a*a-b*b,a*a+b*b),2*a*b);
            if (abs(a*x-b*y)%d!=0) {printf("N
    ");continue;}
            if (abs(b*x-a*y)%d!=0) {printf("N
    ");continue;}
            if (abs(a*x+b*y)%d!=0) {printf("N
    ");continue;}
            if (abs(b*x+a*y)%d!=0) {printf("N
    ");continue;}
            printf("Y
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    CString to char*
    修改mfc中的图标的问题
    MFC Class Wizard要到这里来找
    多文档情形下,窗口的重绘
    64位的ubuntu跑不了32位下编译出来的代码,可是我就是想跑啊
    ubuntu不能执行某个执行文件,这个叫权限不够
    碰到了在ubuntu下不能读windows盘符的问题——ubuntu使用心得
    画个多边形来,CDC
    如果要在mFC客户区添加控件怎么办
    饿汉单例模式实例——取快递
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793372.html
Copyright © 2020-2023  润新知