P2520向量—裴蜀定理应用

P2520向量—裴蜀定理应用

题目:
给你一对数a,b,你可以任意使用(a,b),(a,b),(a,b),(a,b),(b,a),(b,a),(b,a),(b,a)这些向量,问你能不能拼出另一个向量(x,y)

说明:这里的拼就是使得你选出的向量之和为(x,y)

首先,减去(a,b)等价于加上(a,b),其余同理,所以只需要考虑四个向量:(a,b),(b,a),(a,b),(b,a)

所以可以得到方程组:

{(AC)a+(BD)b=x(B+D)a+(A+C)b=y

gcd(a,b)=d,则两个方程有解的充要条件是d|x,d|y(裴蜀定理)。此时即得到了AC,A+C,BD,B+D的值,不妨记为f1,f2,f3,f4。则:A=f1+f22,C=f2f12,B=f3+f42,D=f4f32

所以说,f1,f2需要奇偶性相同,f3,f4同理,现在考虑如何保证奇偶性相同呢?不妨分类讨论:

  1. f1,f2,f3,f4均为偶数,此时有:x=f1a+f3b,提取一个公约数2,变成:d|x22d|x,同理可以得到:2d|y

2d|x,2d|y

  1. f1,f2,f3,f4均为奇数,此时有:x+a+b=(f1+1)a+(f3+1)b,再提取一个公约数2,变成2d|(x+a+b),2d|(y+a+b)

2d|(x+a+b),2d|(y+a+b)

  1. f1,f2为偶数,f3,f4为奇数,此时有:x+b=f1a+(f3+1)b,y+a=(f4+1)a+f2b,类似的我们可以得到:2d|(x+b),2d|(y+a)

2d|(x+b),2d|(y+a)

  1. f1,f2为奇数,f3,f4为偶数,此时有:x+a=(f1+1)a+f3b,y+b=f4a+(f2+1)b,类似的我们可以得到:2d|(x+a),2d|(y+b)

2d|(x+a),2d|(y+b)

四种情况满足一种即可,前提是d|xd|y

#include<iostream>
#include<cstdio>
using namespace std;
#define int long long
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
bool check(int d,int a){
	return a%d==0;
}
signed main(){
	ios::sync_with_stdio(false);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		int a,b,x,y,d1,d2;
		cin>>a>>b>>x>>y;
		d1=gcd(a,b);
		if(x%d1==0&&y%d1==0){
			d1<<=1;
			if(check(d1,x+a+b)&&check(d1,y+a+b))cout<<"Y";
			else if(check(d1,x)&&check(d1,y))cout<<"Y";
			else if(check(d1,x+a)&&check(d1,y+b))cout<<"Y";
			else if(check(d1,x+b)&&check(d1,y+a))cout<<"Y";
			else cout<<"N";
		}
		else cout<<"N";
		cout<<"\n";
	}
}
posted @   spdarkle  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示