[BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)

[BZOJ 2299][HAOI 2011]向量

Description

给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y)。
说明:这里的拼就是使得你选出的向量之和为(x,y)

Input
第一行数组组数t,(t<=50000)
接下来t行每行四个整数a,b,x,y (-2109<=a,b,x,y<=2109)

Output
t行每行为Y或者为N,分别表示可以拼出来,不能拼出来

Solution

1.考虑把八种情况合在一起,发现反向操作可以合并,那么操作也就是有四种(a,b),(-a,b),(b,a),(-b,a);

2.设四种操作进行的次数分别为x1,x2,x3,x4,那么:

对横坐标的操作为x1a-x2a+x3b-x4b,即(x1-x2)a+(x3-x4) b=x;

对纵坐标的操作为x1b+x2b+x3a+x4a,即(x1+x2)b+(x3+x4)a=y;

于是我们验证两方程是否有整数解即可。

3.裴蜀定理告诉我们:当gcd(a,b)|ans时,方程有整数解。

考虑四个系数的奇偶性,因为四个系数是四个数的组合,所以gcd应该是原来的二倍。

比如当x1-x2是奇数时,假设可行解中系数x1+x2为偶数,那就不成立了,所以我们分情况讨论之后发现,满足要求时gcd应该为原来的二倍。

Code

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;

ll g;

inline ll rd(){
    ll x=0;
    bool f=0;
    char c=getchar();
    while(!isdigit(c)){
        if(c=='-')f=1;
        c=getchar();
    }
    while(isdigit(c)){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return f?-x:x;
} 

ll gcd(ll x,ll y){return y?gcd(y,x%y):x;} 

bool valid(ll x,ll y){return (!(x%g))&&(!(y%g));}

int main(){
    ll t=rd();
    while(t--){
        ll a=rd(),b=rd();
        ll x=rd(),y=rd();
        g=gcd(a,b)<<1;
        printf((valid(x,y)||valid(x+a,y+b)||valid(x+b,y+a)||valid(x+a+b,y+a+b))?"Y\n":"N\n");
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/COLIN-LIGHTNING/p/9021978.html

时间: 2024-10-17 19:04:15

[BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)的相关文章

bzoj 2299 [HAOI2011]向量 裴蜀定理

bzoj 2299 [HAOI2011]向量 裴蜀定理 题意: 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y). 限制: -2*1e9 <= a,b,x,y <= 2*1e9 思路: 题目的操作可以化为: 1. x +- 2a; 2. y +- 2a; 3. x +- 2b; 4. y +- 2b; 5. x + a && y

BZOJ 2299 向量(裴蜀定理)

题意:给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y). 实际上前四个向量能拼出(ma,nb)(m%2=n%2).后四个向量拼出(xb,ya)(x%2=y%2). 这样可以枚举这四个未知数在模二意义下的解.这两个向量相加为(ma+xb,nb+ya). 对于ma+xb=X.根据系数的奇偶性,如果有系数为奇数,可使得等式两边都减去一个数使得系数都为偶

【BZOJ-2299】向量 裴蜀定理 + 最大公约数

2299: [HAOI2011]向量 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1118  Solved: 488[Submit][Status][Discuss] Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y). 说明:这里的拼就是使得你选出的向量之和为(x,y)

hdu 6444 网络赛 Neko&#39;s loop(单调队列 + 裴蜀定理)题解

题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手里要有s的价值,那么你至少一开始要有多少价值. 思路:由裴蜀定理可以知道,如果有n个值首尾相连,间隔为k地走,那么最后会有一个循环节,这样的循环节一共有gcd(n, k)个,每个循环节长度n / gcd(n, k)个.所以我们只要找出所有循环节,并且把每个循环节的最大价值算出来就行了.对于每个循环节

BZOJ 2257: [Jsoi2009]瓶子和燃料【数论:裴蜀定理】

2257: [Jsoi2009]瓶子和燃料 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1326  Solved: 815[Submit][Status][Discuss] Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy 的飞船上共有 N个瓶子(1<=N<=1000) ,经过协商,火星人只要其中的K 个 . jyy 将 K个瓶子交给

【BZOJ】1441: Min(裴蜀定理)

http://www.lydsy.com/JudgeOnline/problem.php?id=1441 这东西竟然还有个名词叫裴蜀定理................ 裸题不说....<初等数论>上边写得很清楚:如果对于任意d|ai,有d|sum{aixi} 所以求出d就行了...显然gcd.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #in

[BZOJ1441&amp;BZOJ2257&amp;BZOJ2299]裴蜀定理

裴蜀定理 对于整系数方程ax+by=m,设d =(a,b) 方程有整数解当且仅当d|m 这个定理实际上在之前学习拓展欧几里得解不定方程的时候就已经运用到 拓展到多元的方程一样适用 BZOJ1441 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 该方程有解当且仅当gcd(A1...AN)|s 要求s的值最小,那么答案就是gcd(A1..AN) BZOJ2257 jyy就一直想着尽快回地球,可惜他飞船的燃料不够了.有一天他又去向

【bzoj1441】Min 扩展裴蜀定理

题目描述 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 输入 第一行给出数字N,代表有N个数 下面一行给出N个数 输出 S的最小值 样例输入 2 4059 -1782 样例输出 99 题解 扩展裴蜀定理 裴蜀定理:二元一次不定方程 $ax+by=c$ 存在整数解的充分必要条件是 $\gcd(a,b)|c$. 扩展裴蜀定理:改成n元一次不定方程,结论依然成立. 证明: $a_1x_1+a_2x_2$ 的取值范围为 $k·\gc

Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)

原题地址 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能. 输入描述: 第一行两个整数n,m接下来一行n个整数表示a1,a2,...,an1≤n≤1001≤m,a1,a2,...,an≤1000000000 输出描述: 输出一个整数表示答案 示例1 输入 复制 3 6 6 4 8 输出 复制 3 题解:假设K1为A1取的个数:根据题意题目变成a1*k1+a2*k2+a