【HAOI2011】 向量
数论好劲啊
原题:
给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y)。
说明:这里的拼就是使得你选出的向量之和为(x,y)
t<=50000,-2*10^9<=a,b,x,y<=2*10^9
这题我自己想出了思路,但是怎么都WA,最后膜拜lzx的题解才A
首先其实向量只有四个,比如(a,b)和(-a,-b)是一个东西
然后就可以列出酱紫的方程:
a(x1+x2)+b(y1+y2)=x
b(x1-x2)+b(y1-y2)=y
如果想要有解,首先要保证两个方程分别有解,这个根据扩展欧几里得的性质判断(c%gcd(a,b)!=0时ax+by=c有解)
然后还要满足解出来的(x1+x2),(y1+y2),(x1-x2),(y1-y2)能够解出整数解x1,x2,y1,y2
设x1+x2=e,x1-x2=f,e+f=2*x1,所以当e+f为偶数时有解,y同理
exgcd搞一下判断即可
然后有个问题就是exgcd解出来的答案可能满足条件,但是对这个答案进行一些调整依旧满足条件但是奇偶性变了
调整最多就是x或y加减a或b,总共四种情况,都不能满足偶数条件的时候就无解了
注意longlong
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
#define ll long long
ll rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
ll gcd(ll x,ll y){ return y?gcd(y,x%y):x;}
void exgcd(ll a,ll b,ll &x,ll &y){
if(!b){ x=,y=; return ;}
exgcd(b,a%b,x,y);
ll c=x; x=y,y=c-a/b*x;
}
int n;
char chck(ll x1,ll y1,ll x2,ll y2,ll a,ll b){
if(!((x1+x2)&) && !((y1+y2)&)) return 'Y';
x1+=b,y1-=a;
if(!((x1+x2)&) && !((y1+y2)&)) return 'Y';
x2+=a,y2-=b;
if(!((x1+x2)&) && !((y1+y2)&)) return 'Y';
x1+=b,y1-=a;
if(!((x1+x2)&) && !((y1+y2)&)) return 'Y';
return 'N';
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n;
ll a,b,x,y;
ll x1,x2,y1,y2,ggcd;
while(n--){
a=rd(),b=rd(),x=rd(),y=rd();
exgcd(a,b,x1,y1),exgcd(a,b,y2,x2);
ggcd=gcd(a,b);
if(x%ggcd || y%ggcd) printf("N\n");
else printf("%c\n",chck(x1*x/ggcd,y1*x/ggcd,x2*y/ggcd,y2*y/ggcd,a/ggcd,b/ggcd));
//if(((x1*x+x2*y)/ggcd)&1 || ((y1*x+y2*y)/ggcd)&1) printf("N\n");
//else printf("Y\n");
}
return ;
}
【HAOI2011】 向量的更多相关文章
- 【BZOJ2299】[HAOI2011]向量(数论)
[BZOJ2299][HAOI2011]向量(数论) 题面 BZOJ 洛谷 题解 首先如果我们的向量的系数假装可以是负数,那么不难发现真正有用的向量只有\(4\)个,我们把它列出来.\((a,b)(a ...
- 【BZOJ 2299】 2299: [HAOI2011]向量 (乱搞)
2299: [HAOI2011]向量 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1255 Solved: 575 Description 给你一 ...
- P2520 [HAOI2011]向量
题目描述 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量 ...
- [HAOI2011]向量
题目描述 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量 ...
- 【[HAOI2011]向量】
靠瞎猜的数学题 首先我们先对这些向量进行一顿组合,会发现\((a,b)(a,-b)\)可以组合成\((2a,0)\),\((b,-a)(b,a)\)可以组合成\((2b,0)\),同理\((0,2a) ...
- BZOJ2299 [HAOI2011]向量 【裴蜀定理】
题目链接 BZOJ2299 题解 题意就是给我们四个方向的向量\((a,b),(b,a),(-a,b),(b,-a)\),求能否凑出\((x,y)\) 显然我们就可以得到一对四元方程组,用裴蜀定理判断 ...
- 牛客19985 HAOI2011向量(裴属定理,gcd)
https://ac.nowcoder.com/acm/problem/19985 看到标签“裴属定理”就来做下,很眼熟,好像小学奥数学过.. 题意:给你a,b,x,y,你可以任意使用(a,b), ( ...
- [HAOI2011] 向量 - 裴蜀定理
给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y) ...
- BZOJ2299: [HAOI2011]向量
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2299 题解:乱搞就可以了... 不妨认为有用的只有(a,b)(a,-b)(b,a)(b,-a) ...
- luogu P2520 [HAOI2011]向量
传送门 一堆人说数论只会gcd,我连gcd都不会,菜死算了qwq Orzyyb 这题欺负我数学不好qwq 首先可以发现实际上有如下操作:x或y±2a,x或y±2b,x+a y+b,x+b y+a(后面 ...
随机推荐
- java④
1. 一元运算符:一个表达式就可以参与运算! * ++ -- * * 二元运算符:二个表达式就可以参与运算! * + / * - % * * 三元运算符:三个表达式就可以参与运算! * 数据类型 变量 ...
- shell脚本中出现图形化界面
http://www.ttlsa.com/shell/how-to-create-dialog-boxes-in-interactive-shell-script/
- CSS--margin塌陷
margin塌陷 解决方法: 1.给父级顶加上一条线,不太合适. 2.bfc block format context 设定bfc后,特定的盒子会遵循另一套语法规则,解决了margin塌陷 触发bfc ...
- (C/C++学习笔记) 六. 表达式
六. 表达式 ● 表达式 表达式 expression An expression consists of a combination of operators and operands. (An o ...
- 20165214 实验二 Java面向对象程序设计
一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:朱文远 学号:20165214 指导教师:娄嘉鹏 实验日期:2018年4月16日 实验时间:13:45 - 15:25 实验序号:二 ...
- leetcode第39题:组合综合
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- go语言求1到100之内的质数
素数指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数.换句话说,只有两个正因数(1和自己)的自然数即为素数(也叫质数).比1大但不是素数的数称为合数.1和0既非素数也非合数. ...
- 深入浅出 - vue变化侦测原理
废话真多!!! 其实在一年前我已经写过一篇关于 vue响应式原理的文章,但是最近我翻开看看发现讲的内容和我现在心里想的有些不太一样,所以我打算重新写一篇更通俗易懂的文章. 我的目标是能让读者读完我写的 ...
- python 时间戳转换格式
1.简介 在编写代码时,往往涉及时间.日期.时间戳的相互转换. 2.示例 # 引入模块 import time, datetime 2.1 str类型的日期转换为时间戳 1 # 字符类型的时间 2 t ...
- Python用户交互
print("开始") # 赋值,把等号右边的内容赋值给左边 s = input() #input("这里是input")# input输入,让用户输入一些内容 ...