第七届河南省赛 zzuoj 10402: C.机器人 (拓展欧几里得) 好题
来源:互联网 发布:java删除指定文件 编辑:程序博客网 时间:2024/06/01 08:41
10402: C.机器人
Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 49 Solved: 16
[Submit][Status][Web Board]
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
HINT
Source
第七届河南省赛
思路:(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; ---> Dy + Cx = 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的结果为偶数!
//不理解拓展欧几里得算法的看大神博客:http://blog.csdn.net/zhjchengfeng5/article/details/7786595
#include<stdio.h>#include<string.h>#include<algorithm>#define INF 0x3f3f3f3f#define N 510#define ll long longusing namespace std;ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0){x=1;y=0;return a;}ll d=exgcd(b,a%b,x,y);ll t=x;x=y;y=t-a/b*y;return d;}int main(){int T,i,j;ll x,y,s,t;scanf("%d",&T);while(T--){scanf("%lld%lld%lld%lld",&x,&y,&s,&t);ll 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);int flag=0;for(i=-2;i<=2&&!flag;i++){ll aa,bb;aa=a+x/g*i;bb=b-y/g*i;for(j=-2;j<=2&&!flag;j++){ll cc,dd;cc=c+x/g*j;dd=d-y/g*j;if((aa+dd)%2==0&&(bb+cc)%2==0)flag=1;}}if(flag)printf("Y\n");elseprintf("N\n");}elseprintf("N\n");}return 0;}
- 第七届河南省赛 zzuoj 10402: C.机器人 (拓展欧几里得) 好题
- 第七届河南省赛 zzuoj 10396: H.Rectangles (LIS)
- 第七届河南省赛 zzuoj 10401: A.物资调度 (dfs)
- 第七届河南省赛 zzuoj 10399: F.Turing equation (模拟)
- 第七届河南省赛 zzuoj 10403: D.山区修路 (DP转换&&技巧)
- 第七届河南省赛zzuoj 10395: G.Code the Tree (模拟)prufer数列
- 第八届河南省赛 zzuoj 10408: C.最少换乘 (djs&&字符串转数字)
- 第七届河南省赛 zzuoj 10400: B.海岛争霸 (并查集&最短路(djs))
- zzuoj 10402: C.机器人 【数论 exgcd】
- Intel Code Challenge Final Round C. Ray Tracing 拓展欧几里得或模拟 (好题)
- 第八届河南省赛 zzuoj 10409: D.引水工程 (最小生成树)
- 第八届河南省赛 zzuoj 10411: F.Distribution (模拟)水
- 第八届河南省赛 zzuoj 10412: G.Interference Signal (DP&&贪心)
- 第八届河南省赛 zzuoj 10407: B.最大岛屿
- 第七届河南省赛部分题
- POJ - 2115 C Looooops(拓展欧几里得)
- ZZUOJ-1194-ARM立即数寻址 (郑州大学第七届ACM大学生程序设计竞赛正式赛F题)
- NYOJ 1253 Turing equation (第七届河南省赛)
- 我的小伙伴C语言
- eclipse 配置 wildfly
- 磁盘调度算法(FIFO、SSTF、SCAN、CSCAN)(已经更新bug)
- xgboost入门以及windows下安装及使用一
- 对本地文件的管理
- 第七届河南省赛 zzuoj 10402: C.机器人 (拓展欧几里得) 好题
- 程序员必读书单
- 单例的封装创建与使用
- Java的泛型程序设计
- Android解析json
- 九章算法面试题78 有效回文串
- centos6.5安装mysql5.7
- CF Good Bye 2015 C. New Year and Domino && D. New Year and Ancient Prophecy (DP)
- 2015菜鸟学飞之旅,2016我要飞得更高