本文主要是介绍nefu 84 五指山(扩展欧几里德),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
五指山 | |||
| |||
description | |||
西游记中孙吾空大闹天宫,如来佛祖前来降伏他,说道:“我与你打个赌赛;你若有本事,一筋斗打出我这右手掌中,算你赢,再不用动刀兵苦争战,就请玉帝到西方居住,把天宫让你;若不能打出手掌,你还下界为妖,再修几劫,却来争吵。” 那大圣闻言,暗笑道:“这如来十分好呆!我老孙一筋斗去十万八千里。他那手掌,方圆不满一尺,如何跳不出去?”急发声道:“既如此说,你可做得主张?”佛祖道:“做得!做得!”伸开右手,却似个荷叶大小。那大圣收了如意棒,抖擞神威,将身一纵,站在佛祖手心里,却道声:“我出去也!”你看他一路云光,无影无形去了。大圣行时,忽见有五根肉红柱子,撑着一股青气。他道:“此间乃尽头路了。这番回去,如来作证,灵霄殿定是我坐也。”翻转筋斗云,径回本处,站在如来掌:“我已去,今来了。你教玉帝让天宫与我。” 如来骂道:“你正好不曾离了我掌哩!”大圣道:“你是不知。我去到天尽头,见五根肉红柱,撑着一股青气,我留个记在那里,你敢和我同去看么?”如来道:“不消去,你只自低头看看。”那大圣睁圆火眼金睛,低头看时,原来佛祖右手中指写着“齐天大圣,到此一游。”大圣大吃了一惊道:“有这等事!有这等事!我将此字写在撑天柱子上,如何却在他手指上?莫非有个未卜先知的法术?我决不信!不信!等我再去来!” 好大圣,急纵身又要跳出,被佛祖翻掌一扑,把这猴王推出西天门外,将五指化作金、木、水、火、土五座联山,唤名“五行山”,轻轻的把他压住。我们假设佛祖的手掌是一个圆圈(所以任凭大圣一个筋斗云十万八千里也是飞不出其手掌心),圆圈的长为n,逆时针记为:0,1,2,…,n-1,而大圣每次飞的距离为d.现在大圣所在的位置记为x,而大圣想去的地方在y。现在要你告诉大圣至少要多少筋斗云才能到达目的地。 | |||
input | |||
有多组测试数据。 第一行是一个正整数T,表示测试数据的组数。 每组测试数据包括一行,四个非负整数,n(2 < n < 10^9),表示如来手掌圆圈的长度;d(0 < d < n),筋斗所能飞的距离;x(0 <= x < n),大圣的初始位置;y(0 <= y < n),大圣想去的地方。注意孙悟空的筋斗云只沿着逆时针方向翻。 | |||
output | |||
对于每组测试数据,输出一行,给出大圣最少要翻多少个筋斗云才能到达目的地。如果无论翻多少个筋斗云也不能到达,输出“Impossible”. | |||
sample_input | |||
2 3 2 0 2 3 2 0 1 | |||
sample_output | |||
1 2 | |||
可以得到简单的表达式 ar*d-br*n=len
求出符合要求的ar值就可以
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define MOD 10009
#define MAXN 10010
#define INF 99999999
#define ll long long
#define bug cout<<"here"<<endl
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)using namespace std;int Read()
{char ch;int a = 0;while((ch = getchar()) == ' ' | ch == '\n');a += ch - '0';while((ch = getchar()) != ' ' && ch != '\n'){a *= 10;a += ch - '0';}return a;
}void Print(int a) //输出外挂
{if(a>9)Print(a/10);putchar(a%10+'0');
}ll exgcd(ll m,ll &x,ll n,ll &y)
{ll x1,y1,x0,y0;x0=1; y0=0; x1=0; y1=1;ll r=(m%n+n)%n;ll q=(m-r)/n;x=0; y=1;while(r){x=x0-q*x1; y=y0-q*y1; x0=x1; y0=y1;x1=x; y1=y;m=n; n=r; r=m%n;q=(m-r)/n;}return n;
}int main()
{
// fread;int tc;scanf("%d",&tc);while(tc--){ll n,d,x,y;scanf("%lld%lld%lld%lld",&n,&d,&x,&y);ll ar,br;ll m=exgcd(d,ar,n,br);
// cout<<"m "<<m<<endl;ll len=(y-x+n)%n;if(len%m){puts("Impossible");continue;}ll r=n/m;ar=ar*(len/m);ar=(ar%r+r)%r;printf("%lld\n",ar);}return 0;
}
这篇关于nefu 84 五指山(扩展欧几里德)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!