Title
大意: 给定
N
,
M
,
L
N,M,L
N,M,L,问
n ∗ L + ( n + 1 ) ∗ k = N m ∗ L + ( m + 1 ) ∗ k = M n*L+(n+1)*k=N\\m*L+(m+1)*k=M n∗L+(n+1)∗k=Nm∗L+(m+1)∗k=M
要求 n ∗ m n*m n∗m最大的时候的 k k k
Solution
n ∗ L + ( n + 1 ) ∗ k = N n*L+(n+1)*k=N n∗L+(n+1)∗k=N
( n + 1 ) ∗ ( L + k ) − L = N (n+1)*(L+k)-L=N (n+1)∗(L+k)−L=N
( n + 1 ) ∗ ( L + k ) = N + L ( m + 1 ) ∗ ( L + k ) = M + L (n+1)*(L+k)=N+L\\(m+1)*(L+k)=M+L (n+1)∗(L+k)=N+L(m+1)∗(L+k)=M+L
需要求能被 N + L N+L N+L 和 M + L M+L M+L整除的最小整数。
g = g c d ( N + L , M + L ) g=gcd(N+L,M+L) g=gcd(N+L,M+L),也就是求被 g g g整除的最小整数。
a n s = g / ( g / L ) − L ans=g/(g/L)-L ans=g/(g/L)−L
Code
#include<cstdio>
#include<algorithm>
using namespace std;
int L,n,m; double ans;
int gcd(int x,int y){return (!y)?x:gcd(y,x%y);}
int main(){
scanf("%d%d%d",&L,&n,&m);
int g=gcd(n+L,m+L);
if (n<L||m<L||g<L) return 0&printf("-1");
else return 0&printf("%.5lf",1.0*g/(g/L)-L);
}