标签:mod namespace ret color typedef 坐标 方向 不可 continue
题目链接:http://poj.org/problem?id=1061
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 131879 | Accepted: 29100 |
Description
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
题意如上
解题思路:两只青蛙要相遇,所以可以得出(x+m*t)mod L=(y+n*t) mod L,可以转化为(n-m)*t+L*k=x-y,套用扩展欧几里得模板就可以解除此方程,不过我们要将它转化成最小正整数解。
代码:
#include<iostream.h>
#include<cstdio> using namespace std; typedef long long ll; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} //a*x+b*y=gcd(a,b); //x=y1,y=x1-a/b*y1; void exgcd(ll a,ll b,ll &x,ll &y,ll &c) { if(!b){ x=1; y=0; c=a; return; } exgcd(b,a%b,y,x,c); y-=a/b*x; } //(n-m)*t+k*L=x-y; ll n,m,x,y,L; int main() { while(cin>>x>>y>>m>>n>>L) { ll a=n-m,b=L; ll c=x-y; if(c%gcd(a,b)!=0){ puts("Impossible"); continue; } ll t,k,d; exgcd(a,L,t,k,d); //d=gcd(a,L) //a*t+L*k=gcd(a,L) -> a*t*c/gcd(a,L)+L*k*c/gcd(a,L)=c t=t*(c/d); t=(t%(L/d)+L/d)%(L/d); //化成最小正整数解 cout<<t<<endl; } return 0; }
标签:mod namespace ret color typedef 坐标 方向 不可 continue
原文地址:https://www.cnblogs.com/zjl192628928/p/10327167.html