青蛙的约会(扩展欧几里得解同余方程)
2017-05-22 17:03
253 查看
题目来源:http://poj.org/problem?id=1061
【题意】
大致题意就是解一个方程:设次数为t,则:x+mt-y-nt=kL,化简一下就是:(n-m)t+kL=x-y;其中t,和k是未知数,那么所求结果就是最小的t。
根据扩展欧几里得符合贝祖公式可得(是不是很高大上,,hh,弱弱就不推公式了哈):
ax+by==gcd(a,b)(其中a,b已知,x,y未知),也就是说ax+by==d一定存在解。
而这里:gcd(a,b)==d,我们设a=n-m,b=k,u=x-y那么就变成了
a/d*x’+b/d*y’==u/d所以我们只需要判断一下:
u%d是否为0,就可以知道ax’+by’==u有没有解。
因为ax1+by1==d一定=存在,所以两边同时乘以c/d:
a(c/d*x1)+b(c/d*y1)==c。
又因为ax+by==c
所以对应的x=c/d*x1,y=c/d*y1.
至于怎么求x1,y1呢?
利用扩展欧几里得求出最小的一组解x1,y1。
对于x1,可以无限加b,因为a(x+k*b)≡c(mod b);
对应的,对于y1,可以无限加a,因为b(y+k*a)≡c (mod a);
【代码】
【题意】
大致题意就是解一个方程:设次数为t,则:x+mt-y-nt=kL,化简一下就是:(n-m)t+kL=x-y;其中t,和k是未知数,那么所求结果就是最小的t。
根据扩展欧几里得符合贝祖公式可得(是不是很高大上,,hh,弱弱就不推公式了哈):
ax+by==gcd(a,b)(其中a,b已知,x,y未知),也就是说ax+by==d一定存在解。
而这里:gcd(a,b)==d,我们设a=n-m,b=k,u=x-y那么就变成了
a/d*x’+b/d*y’==u/d所以我们只需要判断一下:
u%d是否为0,就可以知道ax’+by’==u有没有解。
因为ax1+by1==d一定=存在,所以两边同时乘以c/d:
a(c/d*x1)+b(c/d*y1)==c。
又因为ax+by==c
所以对应的x=c/d*x1,y=c/d*y1.
至于怎么求x1,y1呢?
利用扩展欧几里得求出最小的一组解x1,y1。
对于x1,可以无限加b,因为a(x+k*b)≡c(mod b);
对应的,对于y1,可以无限加a,因为b(y+k*a)≡c (mod a);
【代码】
#include<set> #include<map> #include<stack> #include<cmath> #include<queue> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<limits.h> #include<algorithm> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int mod=1e9+7; typedef unsigned long long ll; typedef long long LL; 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,y,x); y-=a/b*x; return d; } int main() { LL u,v,m,n,L,x,y,d,r; while(~scanf("%lld%lld%lld%lld%lld",&u,&v,&m,&n,&L)) { d=exgcd(n-m,L,x,y); r=L/d; if((u-v)%d) printf("Impossible\n"); else printf("%lld\n",((u-v)/d*x%r+r)%r); } }
相关文章推荐
- 扩展欧几里得详解 NOIP2012同余方程 青蛙的约会
- POJ - 1601 - 青蛙的约会 - (扩展欧几里得解同余方程)
- poj 1061 青蛙的约会(扩展欧几里得)
- poj 1061 青蛙的约会 (线性同余,扩展欧几里得)
- PKU1061 解题报告 青蛙的约会 __用扩展欧几里得解模同余方程
- POJ - 1061 青蛙的约会(扩展欧几里得)
- POJ 1061 青蛙的约会 扩展欧几里得
- 扩展欧几里得 POJ1061青蛙的约会
- POJ 1061 青蛙的约会 (扩展欧几里得)
- poj1061青蛙的约会(扩展欧几里得)
- (Relax 数论1.6)POJ 1061 青蛙的约会(扩展的欧几里得公式)
- poj 1061 小白算法练习 数论 扩展欧几里得 青蛙的约会
- Poj 1061 青蛙的约会(扩展欧几里得)
- 再论扩展欧几里得—POJ 1061 青蛙约会
- POJ1061 青蛙的约会(扩展欧几里得)
- 青蛙的约会(欧几里得扩展)
- Poj 1061 青蛙的约会(扩展欧几里得)
- 扩展欧几里得求最小非负整数解 (POJ 1061 青蛙约会为例)
- 青蛙的约会 扩展欧几里得
- poj1061 青蛙的约会 扩展欧几里得