扩展欧几里得算法蓝桥 五指山

大圣在佛祖的手掌中。

我们假设佛祖的手掌是一个圆圈,圆圈的长为 n
,逆时针记为:0,1,2,…,n−1,而大圣每次飞的距离为 d

现在大圣所在的位置记为 x
,而大圣想去的地方在 y

要你告诉大圣至少要飞多少次才能到达目的地。

注意:孙悟空的筋斗云只沿着逆时针方向翻。
输入格式

有多组测试数据。

第一行是一个正整数 T

,表示测试数据的组数;

每组测试数据包括一行,四个非负整数,分别为如来手掌圆圈的长度 n
,筋斗所能飞的距离 d,大圣的初始位置 x 和大圣想去的地方 y


输出格式

对于每组测试数据,输出一行,给出大圣最少要翻多少个筋斗云才能到达目的地。

如果无论翻多少个筋斗云也不能到达,输出 Impossible。
数据范围

2<n<109
,
0<d<n,
0≤x,y<n

输入样例:

2
3 2 0 2
3 2 0 1

输出样例:

1
2
思路:
假设吉吉国王走qq步走过了 tt圈
则满足等式。
y-x+ttn=qqd 其中qq和tt是未知数 可以求出他们的公约数,如果y-x不能被最大公约数整除 就是不行的。否则 求出qq,根据exgcd求出qq0 根据结论 qq=qq0+k*(n/公约数) 求出最小正整数

#include<bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
	if(!b)
	{
		x=1,y=0;
		return a;
	}
	int d=exgcd(b,a%b,y,x);
	y-=(a/b)*x;
	return d;
}
int main()
{
	int a,b,x,y;
	int ans1,ans2;
	cin>>a>>b>>x>>y;
	int d;
	d=exgcd(a,b,ans1,ans2);
	printf("%d\n",d);
	if((y-x)%d)
	printf("Impossible\n");
	else
	printf("%d\n",abs((y-x)/d*ans2));
}

在这里插入图片描述

发布了165 篇原创文章 · 获赞 8 · 访问量 2500

猜你喜欢

转载自blog.csdn.net/qq_45961321/article/details/104705665
今日推荐