// 题意: 解同余方程 (m-n)t≡y-x(mod L),求出t的最小解
#include<iostream>
using namespace std;
int x_0,y_0,q;
void extend_eulid(int a,int b) //x_0*a+y_0*b=gcd(a,b)=q
{
if(b==0)
{
x_0=1;y_0=0;q=a;
}
else
{
extend_eulid(b,a%b);
int temp=x_0;
x_0=y_0;y_0=temp-a/b*y_0;
}
}
// 解同余方程 (m-n)t≡y-x(mod L) , 相当于ax≡n (mod b),即 a=m-n, x=t, n=y-x , b=L
int main()
{
long long x,y,m,n,L,t;
cin>>x>>y>>m>>n>>L;
extend_eulid(m-n,L);
if( (y-x)%q != 0 )
cout<<"Impossible\n";
else
{
t = x_0*(y-x)/q;
int ff=L/q > 0 ? L/q : -L/q; //要对(L/q)取绝对值,因为q=(m-n,L)有可能是负值
int X=(t%ff+ff)%ff;
cout<<X<<endl;
}
return 0;
}
/*
形如 ax≡n (mod b),可化成 ax + by = n, x有整数解的充分必要条件是 n % (a,b)==0,(a,b)表示gcd(a,b)
方程 a*x+b*y=n;我们可以先用扩展欧几里德算法求出一组x_0,y_0。
也就是 a * x_0 + b * y_0 =(a,b);
然后两边同时除以(a,b),再乘以n。
这样就得到了方程 a * x_0 * n/(a,b)+ b * y_0 * n/(a,b)= n;
方程的一个解: x = x_0 * n/(a,b), y = y_0 * n/(a,b)
其他的解都为 x_1,2...≡x+(b/(a,b))*i , y_1,2...≡y-(a/(a,b))*i (0 <=i<=(a,b)-1)。 i=0 时即为上面的一组解
总共有gcd(a,b)组解
令ff=b/(a,b),则x的最小非负整数解为 x = x_0 * n/(a,b), X = ( x % ff + ff ) % ff ;
*/
poj 1061 青蛙的约会
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
函数递归经典题目——汉诺塔,青蛙跳台阶
递归常见例题——斐波那契、汉诺塔、青蛙跳台阶
递归 n的阶乘 i++ -
有趣的CSS - 弹跳的圆
用css写一个好玩的不停弹跳变形的圆。
css 弹跳的圆 动效 动画 交互 -
有趣的CSS - 旋转的金币
今天分享的是一个旋转的金币,适用于游戏网站,会员币等场景。
css 旋转的金币 动效 ux 用户体验 -
POJ 1061 青蛙的约会
C - 青蛙的约会Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%
最大公约数 Memory #include -
POJ 1061 青蛙的约会
Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是
poj #include #define ios -
POJ 1061 青蛙的约会——扩展欧几里得
首先我们先来介绍一下欧几里得算法和扩展欧几里得算法:欧几里得算法又称辗转相除法,
欧几里得算法 最大公约数 扩展欧几里得 -
POJ 1061 青蛙的约会(扩展欧几里德)
青蛙的约会题解:显然可以列出方程(x+k⋅m)%L=(y+k⋅n)%L(x+k\cdot mtre...
exgcd poj ios #include #ifndef -
【POJ 1061】 青蛙的约会
【题目链接】 点击打开链接 【算法】 列出同余方程,然后用exgcd求解 【代码】
#include ios git 同余方程 学习 -
【POJ】[1061]青蛙的约会
青蛙的约会Time Limit: 1000M...
整除 #include 同余方程 扩展欧几里德 欧几里德算法