解法:直接上模版。
扩展欧几里德的模版:
typedef long long LL; LL ex_gcd(LL a,LL b,LL &x,LL &y) { if(b==0) { x=1; y=0; return a; } LL d=ex_gcd(b,a%b,x,y); LL t=x; x=y; y=t-a/b*y; return d; }
LL solve(LL n) { LL a1,r1,a2,r2; LL a,b,c,r,x,y; bool ifhave=true; scanf("%lld%lld",&a1,&r1); for(LL i=1;i<n;i++) { scanf("%lld%lld",&a2,&r2); if(ifhave) { a=a1,b=a2,c=r2-r1; r=ex_gcd(a,b,x,y); if(c%r) { ifhave=false; continue; } LL t=b/r; x=(x*(c/r)%t+t)%t; r1=a1*x+r1; a1=a1*(a2/r); } } if(!ifhave) return -1; else return r1; }
题目: poj 2891 Strange Way to Express Integers
代码:
#include <iostream> #include <cstdio> #include <cmath> using namespace std; typedef long long LL; LL ex_gcd(LL a,LL b,LL &x,LL &y) { if(b==0) { x=1; y=0; return a; } LL d=ex_gcd(b,a%b,x,y); LL t=x; x=y; y=t-a/b*y; return d; } LL solve(LL n) { LL a1,r1,a2,r2; LL a,b,c,r,x,y; bool ifhave=true; scanf("%lld%lld",&a1,&r1); for(LL i=1;i<n;i++) { scanf("%lld%lld",&a2,&r2); if(ifhave) { a=a1,b=a2,c=r2-r1; r=ex_gcd(a,b,x,y); if(c%r) { ifhave=false; continue; } LL t=b/r; x=(x*(c/r)%t+t)%t; r1=a1*x+r1; a1=a1*(a2/r); } } if(!ifhave) return -1; else return r1; } int main() { LL n; while(cin>>n) { cout<<solve(n)<<endl; } return 0; }
原文地址:http://blog.csdn.net/knight_kaka/article/details/28897407