测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A51990. 五指山

填空题 较难

题目描述

五指山

题目描述

大圣在佛祖的手掌中。

我们假设佛祖的手掌是一个圆圈,圆圈的长为 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

参考答案

#include<stdio.h> typedef long long LL; LL exgcd(LL a,LL b,LL &x,LL &y) { if(!b) { x=1,y=0; return a; } LL d=exgcd(b,a%b,y,x); y-=(a/b)*x; return d; } int main() { int T; scanf("%d",&T); LL n,d,x,y,a,b; while(T--) { scanf("%lld%lld%lld%lld",&n,&d,&x,&y); LL gcd=exgcd(n,d,a,b); if((y-x)%gcd!=0) printf("Impossible\n"); else { b*=(y-x)/gcd; n/=gcd; //保证模的结果为正,基操 printf("%lld\n",((b%n)+n)%n); } } return 0; }
上一题 下一题