[HAOI2011]向量(裴蜀定理)
作者:互联网
- 注释:本章同余针对2。
- 题面
- 题意:见题面。
- 解决思路:考虑前四个向量(a,b),(a,−b),(−a,b),(−a,−b),设共取出n个向量,a,−a,b,−b的个数分别为xa1,xa2,yb1,yb2。
{ xa1+xa2=n yb1+yb2=n
n个向量之和为(axa1−axa2,byb1−byb2)
设x1=xa1−xa2,y1=yb1−yb2,证明x1≡y1
n≡p,p的取值为0或1
∴{ xa1+xa2≡p yb1+yb2≡p
∴{ xa1+xa2−2xa2≡p yb1+yb2−2yb2≡p
∴{ xa1−xa2≡p yb1−yb2≡p
∴x1≡y1≡p
证毕!!!
结论:n个向量之和为(ax1,by1),x1≡y1
同理考虑后四个向量(b,a),(b,−a),(−b,a),(−b,−a),设共取出m个向量,设m个向量之和为(by2,ax2),且y2≡x2
八个向量之和为(ax1+by2,by1+ax2),x1≡y1,y2≡x2
∴{ ax1+by2=x x1≡y1 by1+ax2=y y2≡x2
∴{ ax1+by2=x x1≡y1 ax2+by1=y y2≡x2
情况一:x1≡y1≡0,y2≡x2≡0
∴{ ax1+by2=x ax2+by1=y
将同余0的项提出2
∴{ 2ax1′+2by2′=x 2ax2′+2by1′=y
有解的条件是(2a,2b)∣x,(2a,2b)∣y
情况二:x1≡y1≡0,y2≡x2≡1
∴{ ax1+by2=x ax2+by1=y
将同余0的项提出2
∴{ 2ax1′+by2=x ax2+2by1′=y
∴{ 2ax1′+b(y2+1)=x+b a(x2+1)+2by1′=y+a
∴{ 2ax1′+2by2′=x+b 2ax2′+2by1′=y+a
有解的条件是(2a,2b)∣(x+b),(2a,2b)∣(y+a)
同理
情况三:有解的条件是(2a,2b)∣(x+a),(2a,2b)∣(y+b)
情况四:有解的条件是(2a,2b)∣(x+a+b),(2a,2b)∣(y+a+b) - AC代码
//优化
#pragma GCC optimize(2)
//C
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//C++
//#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<istream>
#include<iomanip>
#include<climits>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
//宏定义
#define N 1010
#define DoIdo main
//#define scanf scanf_s
#define it set<ll>::iterator
//定义+命名空间
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 998244353;
const ll INF = 1e18;
const int maxn = 1e6 + 10;
using namespace std;
//全局变量
//函数区
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); }
//主函数
int DoIdo() {
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int T;
cin >> T;
while (T--) {
ll a, b, x, y;
cin >> a >> b >> x >> y;
ll g = gcd(2 * a, 2 * b);
bool jg = 0;
if (x % g == 0 && y % g == 0) jg = 1;
if ((x + a) % g == 0 && (y + b) % g == 0) jg = 1;
if ((x + b) % g == 0 && (y + a) % g == 0) jg = 1;
if ((x + a + b) % g == 0 && (y + a + b) % g == 0) jg = 1;
if (jg) cout << "Y" << endl;
else cout << "N" << endl;
}
return 0;
}
//分割线---------------------------------QWQ
/*
*/
标签:裴蜀,y1,2a,2b,small,cases,equiv,向量,HAOI2011 来源: https://blog.csdn.net/qq_45739057/article/details/106226538