洛谷题单指南-基础线性代数-P2520 [HAOI2011] 向量

原题链接:https://www.luogu.com.cn/problem/P2520

题意解读:已知a,b,x,y,判断c1(a,b)+c2(b,a)+c3(a,-b)+c4(b,-a)=(x,y),对于c1,c2,c3,c4是否有整数解。

解题思路:

进一步拆解方程,可以得到:

(c1+c3)a + (c2+c4)b = x         [方程1]

(c1-c3)b + (c2-c4)a = y         [方程2]

根据裴蜀定理可知,要使c1+c3,c2+c4有整数解,必须有gcd(a,b) | x,同理gcd(b,a) | y

但是c1+c3,c2+c3有整数解不代表c1、c3、c2、c4有整数解。

设t1=c1+c3,t2=c1-c3,t3=c2+c4,t4=c2-c4

则有c1=(t1+t2)/2,c3=(t1-t2)/2,c2=(t3+t4)/2,c4=(t3-t4)/2

要使得c1、c3、c2、c4有整数解,必须满足t1+t2,t1-t2,t3+t4,t3-t4是偶数

也就是t1、t2同奇偶,t3、t4同奇偶

也就是c1+c3、c1-c3同奇偶,c2+c4、c2-c4同奇偶

分类讨论:

1、c1+c3、c1-c3奇,c2+c4、c2-c4奇

对于方程1,要使得c1、c2、c3、c4有整数解,两边同时加上a+b,(c1+c3+1)a+(c2+c4+1)b=x+a+b,必须2gcd(a,b) | x+a+b

对于方程2,同理得到2gcd(a,b) | y+a+b

2、c1+c3、c1-c3奇,c2+c4、c2-c4偶

对于方程1,两边同时加上a,(c1+c3+1)a+(c2+c4)b=x+a,必须2gcd(a,b) | x+a

对于方程2,同理得到2gcd(a,b) | y+b

3、c1+c3、c1-c3偶,c2+c4、c2-c4奇

对于方程1,两边同时加上b,(c1+c3)a+(c2+c4+1)b=x+b,必须2gcd(a,b) | x+b

对于方程2,同理得到2gcd(a,b) | y+a

4、c1+c3、c1-c3偶,c2+c4、c2-c4偶

对于方程1,必须2gcd(a,b) | x

对于方程2,必须2gcd(a,b) | y

以上四种情况,满足任意一种即可。

100分代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL t, a, b, x, y;

LL gcd(LL a, LL b)
{
    if(b == 0) return a;
    return gcd(b, a % b);
}

bool check(LL t1, LL t2, LL d)
{
    if(t1 % d == 0 && t2 % d == 0) return true;
    return false;
}

int main()
{
    cin >> t;
    while(t--)
    {
        cin >> a >> b >> x >> y;
        LL d = gcd(a, b) * 2;
        if(check(x + a + b, y + a + b, d) || check(x + a, y + b, d) || check(x + b, y + a, d) || check(x, y, d)) cout << "Y" << endl;
        else cout << "N" << endl;
    }
    return 0;
}

 

posted @ 2026-02-24 19:13  hackerchef  阅读(1)  评论(0)    收藏  举报