poj 1061
2012-11-13 15:09
176 查看
哎,折腾了一中午,终于ac拉。考察的是欧拉算法的扩展。我在此题中,思考的时间最长的部分就是通过扩展了欧拉算法得到了解后,如何得到最小的正整数解。对于这个小问题,我却百思不得其解。然后在网上找了解题报告后,才有了思路,就是先求出解系,然后通过这个解系的式子得到最小的整数解
#include <iostream>
#include <cmath>
using namespace std;
void gcd(long long a,long long b,long long &gcdd,long long &w,long long &t)
{
if(b==0)
{
gcdd=a;w=1;t=0;
}
else
{
gcd(b,a%b,gcdd,t,w);
t-=w*(a/b);
}
}
int main()
{
long long x,y,m,n,l;
while(cin>>x>>y>>m>>n>>l)
{
bool flag=false;
long long dl=y-x;
long long ds=m-n;
if(ds<0)
{
ds=-ds;
flag=true;
}
long long gcdd,t,w;
gcd(l,ds,gcdd,w,t);
if(dl%gcdd!=0) cout<<"Impossible"<<endl;
else
{
t*=(dl/gcdd);
if(flag)
t=-t;
l=l/gcdd;
if(t<0)//这一步还可优化,但是目前还没看懂网上的代码
{
while(t<0) t+=l;
}
else
{
while(t>0) t-=l;
t+=l;
}
cout<<t<<endl;
}
}
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
void gcd(long long a,long long b,long long &gcdd,long long &w,long long &t)
{
if(b==0)
{
gcdd=a;w=1;t=0;
}
else
{
gcd(b,a%b,gcdd,t,w);
t-=w*(a/b);
}
}
int main()
{
long long x,y,m,n,l;
while(cin>>x>>y>>m>>n>>l)
{
bool flag=false;
long long dl=y-x;
long long ds=m-n;
if(ds<0)
{
ds=-ds;
flag=true;
}
long long gcdd,t,w;
gcd(l,ds,gcdd,w,t);
if(dl%gcdd!=0) cout<<"Impossible"<<endl;
else
{
t*=(dl/gcdd);
if(flag)
t=-t;
l=l/gcdd;
if(t<0)//这一步还可优化,但是目前还没看懂网上的代码
{
while(t<0) t+=l;
}
else
{
while(t>0) t-=l;
t+=l;
}
cout<<t<<endl;
}
}
return 0;
}
相关文章推荐
- POJ - 1061 青蛙的约会(拓展GCD
- poj-1061
- POJ 1061 青蛙的约会 中文
- poj解题报告——1061
- poj 1061 青蛙的约会(用欧几里得解线性方程)
- poj 1061 青蛙的约会
- poj1061-青蛙的约会(扩展欧几里德算法)
- 青蛙的约会 POJ - 1061 拓展欧几里得
- poj 1061 青蛙的约会(gcd拓展,解不定方程)
- 解题报告 :POJ1061 青蛙的约会 数论/扩展欧几里德模板题
- poj 1061 扩展欧几里得
- [ACM] POJ 1061青蛙的约会(扩展欧几里得求模线性方程)
- 青蛙的约会 POJ - 1061
- luogu1516 POJ1061 青蛙的约会
- pOJ-1061 exgcd求同余方程组
- poj 1061 青蛙的约会
- POJ 1061 青蛙的约会
- POJ - 1061 - 青蛙的约会
- poj 1061 青蛙的约会
- 青蛙的约会(poj1061+欧几里德)