#gcd# [校测 堆箱子]

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 nL+(n+1)k=NmL+(m+1)k=M

要求 n ∗ m n*m nm最大的时候的 k k k


Solution

n ∗ L + ( n + 1 ) ∗ k = N n*L+(n+1)*k=N nL+(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); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值