poj 1061
哎,折腾了一中午,终于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; }