(扩展欧几里德算法)zzuoj 10402: C.机器人

简介:

10402: C.机器人


Description
Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远。由于受软硬件设计所限,机器人卡尔只能定点跳远。若机器人站在(X,Y)位置,它可以原地蹦,但只可以在(X,Y),(X,-Y),(-X,Y),(-X,-Y),(Y,X),(Y,-X),(-Y,X),(-Y,-X)八个点跳来跳去。
 
现在,Dr. Kong想在机器人卡尔身上设计一个计数器,记录它蹦蹦跳跳的数字变化(S,T),即,路过的位置坐标值之和。
 
你能帮助Dr. Kong判断机器人能否蹦蹦跳跳,拼出数字(S,T)吗?
 
假设机器人卡尔初始站在(0,0)位置上。
 
 
Input
第一行:             K                表示有多少组测试数据。
 
接下来有K行,每行:X  Y  S  T    
 
 
1≤K≤10000   -2*109 <= X , Y, S, T <= 2*109
 
 
数据之间有一个空格。
 
 
 
 
Output
对于每组测试数据,输出一行:Y或者为N,分别表示可以拼出来,不能拼出来
 
Sample Input
3
2 1 3 3
1 1 0 1
1 0 -2 3
Sample Output
Y
N
Y


v欧几里德与扩展欧几里德算法 :http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html
/*
	思路:(X,Y),(X,-Y),(-X,Y),(-X,-Y),(Y,X),(Y,-X),(-Y,X),(-Y,-X)
	虽然八个点,其实有用的只有四个点,其他的四个点都可以被替代,比如
	(x,y)可以替代 (-x, -y) <-> -[(x, y)]
	设这四个点是(x,y), (x, -y), (y, x), (y,-x)分别经过a1, a2, a3, a4次
	则有
		(a1+a2)x + (a3+a4)y = s;  ---> Ax + By = s; (很明显的不定方程的形式) 
		(a1-a2)y + (a3-a4)x = t;  ---> Dx + Cy = t;
	仔细观察上述式子, A+D 和 B+C 都是 偶数 
	对于Ax + By = s,可以利用exgcd()求出A, B的值,同理也可以求出D,C的值
	如果A,B 为等式的解,那么其余的结为: 
		A = A + y/gcd(A, B)*t(其中t为任意整数)
		B = B + x/gcd(A, B)*t
	
	利用上面的式子, 枚举 A,B,C,D ,知道 满足 A+D 和 B+C的结果为偶数! 
*/  
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#define MAX 0x3f3f3f3f
#define N 550
using namespace std;

long long exgcd(long long a,long long b,long long &x,long long &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    long long r=exgcd(b,a%b,x,y);
    long long t=x;
    x=y;
    y=t-a/b*y;
    return r;
}

/*
    x = x + b/gcd(a, b)*t;
    y = y - a/gcd(a, b)*t;
*/

int main() {
    int k;
    long long x, y, s, t;
    scanf("%d", &k);
    while(k--){
        scanf("%lld%lld%lld%lld", &x, &y, &s, &t);
        long long a, b, c, d, g;
        g = exgcd(x, y, a, b);
        c = a;
        d = b;
        if(s%g==0 && t%g==0){
            a = a*(s/g);
            b = b*(s/g);
            c = c*(t/g);
            d = d*(t/g);
            bool flag = false;
            for(int i=-2; i<=2 && !flag; ++i){
                long long aa, bb;
                aa = a+x/g*i;
                bb = b-y/g*i;
                for(int j=-2; j<=2 && !flag; ++j){
                    long long cc, dd;
                    cc = c+x/g*j;
                    dd = d-y/g*j; 
                    if((aa+dd)%2==0 && (bb+cc)%2==0)
                        flag = true;
                }
            }
            if(flag)    printf("Y\n");
            else printf("N\n");
        } else {
            printf("N\n") ;
        }
    }
    return 0;
}

目录
相关文章
|
4月前
|
算法
class072 最长递增子序列问题与扩展【算法】
class072 最长递增子序列问题与扩展【算法】
43 0
|
4月前
|
算法
class071 子数组最大累加和问题与扩展-下【算法】
class071 子数组最大累加和问题与扩展-下【算法】
41 0
|
4月前
|
算法 数据处理 C++
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
573 1
|
3月前
|
机器学习/深度学习 算法 搜索推荐
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
|
17天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
3月前
|
算法 机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
|
4月前
|
算法 数据安全/隐私保护
什么是扩展欧几里得算法?
【5月更文挑战第13天】什么是扩展欧几里得算法?
67 3
|
4月前
|
算法 搜索推荐 程序员
C语言第三十三练—— KMP算法和扩展 KMP算法
C语言第三十三练—— KMP算法和扩展 KMP算法
59 0
|
4月前
|
算法 搜索推荐 程序员
C语言第二十二练——扩展欧几里得算法
C语言第二十二练——扩展欧几里得算法
48 0
|
4月前
|
人工智能 算法 机器人
【Python数据结构与算法】--- 递归算法的应用 ---[乌龟走迷宫] |人工智能|探索扫地机器人工作原理
【Python数据结构与算法】--- 递归算法的应用 ---[乌龟走迷宫] |人工智能|探索扫地机器人工作原理
58 0