POJ 1061 青蛙的约会

来源:互联网 发布:java 格式化数字 编辑:程序博客网 时间:2024/06/11 17:47

Poj 1061 青蛙的约会


算法解析:使用扩展欧几里得算法,算是经典的欧几里得原理的应用编程题


辗转相除法(欧几里得算法):gcd(a,b)=gcd(b, a mod b)


扩展欧几里得算法,实际用于求q,p a*p+b*q=gcd(a,b)


求法参照二元一次不定方程解法


算法代码注意事项:由于编译会使得a%b(a<0,b>0)=r<0,若需要使r计算结果为正,r=(a%b+b)%b,这样r必然为正,(注意此题b必然大于0所以不必考虑a%b b<0情况,VS2008编译器似乎是根据a的正负来判断余数r的结果)


算法代码:写的比较潦草...

#include<iostream>#include<cmath>using namespace std;//#include <fstream>//求最大公约数,a,b均大于0long long GetGcd(long long a, long long b){long long r=a%b;while (r){a=b;b=r;r=a%b;}return b;}long long k1,k2;void Calculate(long long a, long long b){long long tmp,r;r=(a%b+b)%b;if (b%r==0){k1=1;k2=(r-a)/b;return;}else{Calculate(b,r);tmp=k1;k1=k2;k2=(tmp-k2*(a/b));return;}}int main(){//ifstream infile("test.txt");//ofstream outfile("result.txt");long long x,y,m,n,l;long long t;//infile>>x>>y>>m>>n>>l;cin>>x>>y>>m>>n>>l;if (m==n){cout<<"Impossible"<<endl;return 0;}long long gcd;if (m-n<0)gcd=GetGcd(n-m,l);elsegcd=GetGcd(m-n,l);if ((x-y)%gcd==0){Calculate((n-m)/gcd,l/gcd);k1=k1*(x-y)/gcd;k2=k2*(x-y)/gcd;t=l/gcd;k1=(k1%t+t)%t;cout<<k1<<endl;} else{cout<<"Impossible"<<endl;}//infile.close();//outfile.close();return 0;}

参考资料:一个关于本题解题报告的PPT,不过写的比较潦草