Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 90269 | Accepted: 16399 |
Description
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
Source
此题暴力求解必定超时,一般计算机计算一亿次就为一秒,L超过了20亿所以显然不行。其中一种方式是利用相对性,把速度慢的青蛙看成静止,而速度快的青蛙去追赶速度慢者。设m速度快 n速度慢,那么他们开始距离就为dist=(y-x+l)%l。设m青蛙的坐标为0,n青蛙坐标为dist且设经过k时间,跑了i圈之后m青蛙跑到了n青蛙的坐标。那么就有下列式子:
(m-n)*k==l*i+dist;
假如p为(m-n)与l的最大公约数gcd(m-n,l),那么若dist%p不为零,直接就可以判断为不可行的。而且dist%p为零时是一定可行的,具体原因讲第二种方法时再解释,先看第一种方法的解法:
#include<iostream>
using namespace std;
long long x,y,m,n,l,dist;
int gcd(int a,int b){//辗转相除法求最大公约数
if(b==0)return a;
return gcd(b,a%b);
}
int main()
{
while(cin>>x>>y>>m>>n>>l){
if(m>n)dist=(y-x+l)%l;
else {
dist=(x-y+l)%l;
int temp=m;
m=n;n=temp;
}
if(m==n||dist%gcd(m-n,l)){
cout<<"Impossible"<<endl;
continue;
}
long long k=0;
for(int i=0;;i++){
if((i*l+dist)%(m-n)==0){
k=(i*l+dist)/(m-n);
break;
}
}
cout<<k<<endl;
}
return 0;
}
外带超精简代码一发: #include <stdio.h> int main() { unsigned long x,y,m,n,L; scanf("%ld %ld %ld %ld %ld",&x,&y,&m,&n,&L); if (m==n) printf("Impossible\n"); else { if(m>n) {m=m-n;x=(y-x+L)%L;} else {m=n-m;x=(x-y+L)%L;} n=x/m;x=x%m;y=x; while(1) { if(y==0) {printf("%ld\n",n);break;} n=n+(y+L)/m;y=(y+L)%m; if(y==x) {printf("Impossible\n");break;} } } return 0; }
原文地址:http://blog.csdn.net/qq2256420822/article/details/38518039