Description
jwMM和她的好朋友GG一起在公园里散步的时候,眼前突然出现了一个悬浮的箭靶,jwMM马上拿出了自己藏在身上的弓,准备射中箭靶,向好朋友炫耀。但是她的好朋友GG知道jwMM的弓术无比差劲,就决定用念力帮她维护一下她脆弱的自尊心。现在给出箭靶的坐标x1,y1,jwMM射出的箭被念力包裹时的坐标x2,y2,如果x2-y2恰好是x1与y1的某个大于1的公因子的正整数倍,则可以射中,否则就射不中。 请判断最后jwMM是否能够射中靶子,如果能,输出Y,否则输出N。
Input
多组输入。 每组输入四个整数x1,y1,x2,y2。 x1,y1代表箭靶的坐标,x2,y2代表箭被念力包裹时的坐标。 保证所有输入数据为正且在int范围之内。
Output
输出Y或N。
Analysis
题目就是要求一个数a是否是数b的某个大于1的因子的正整数倍。
一开始我将b的所有因子一次获取比较,发现会超时
再优化可以知道,我们要找的这样一个因子c满足a%c==0, b%c==0
可以发现,这样的c相当于a和b的某一公因子,而快速判断这样一个不为1的公因子是否存在,即是判断a和b的最大公因子是否为1,如果不为1才存在这样的一个公因子,反之则不存在
Accepted Code
/*
* @Author: Gehrychiang
* @LastEditors: Gehrychiang
* @Website: www.yilantingfeng.site
* @E-mail: gehrychiang@aliyun.com
*/
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x1, x2, y1, y2;
while (cin >> x1 >> y1 >> x2 >> y2)
{
int flag = 1;
int a = x2 - y2;
int b = __gcd(x1, y1);
if (a <= 0) //特判不可能
{
flag = 0;
}
if (b == 1) //特判不可能之二
{
flag = 0;
}
//找到一个数c c*m=b c*n=a
int c = __gcd(a, b);
if (c > 1 && flag == 1)
{
cout << "Y" << endl;
}
else
{
cout << "N" << endl;
}
}
return 0;
}

