怪兽(二元二次方程计算)

码题集OJ-怪兽 (matiji.net)

没啥好说的, 枚举n3,验证,结束!

#include<iostream>
using namespace std;
typedef long long LL;
LL p,q,n1,n2,n3;
bool check(int u) {
	/*x+y+u=p=>n1x+n1y+n1u=n1p=>n2x+n2y+n2u=n2p;
	n1*x+n2*y+n3*u=q;
	所以
	(n2-n1)y+(n3-n1)u=q-n1p
	(n2-n1)x+(n2-n3)u=n2p-q*/
	if(q-n1*p-(n3-n1)*u<0||n2*p-q-(n2-n3)*u<0)return false;
	if(n2==n1) {
		return (q-n3*u)/n1==p-u;
	}
	LL y=(q-n1*p-(n3-n1)*u)/(n2-n1);
	LL x=(n2*p-q-(n2-n3)*u)/(n2-n1);
	return x+y+u==p;
}
int main(void) {
	scanf("%lld%lld%lld%lld%lld",&p,&q,&n1,&n2,&n3);
	int l=0,r=p;
	//怪兽王最小是多少
	while(l<=r) {
		if(check(l)) {
			break;
		}
		l++;
	}
	//怪兽王最大是多少
	while(l<=r) {
		if(check(r)) {
			break;
		}
		r--;
	}
	check(l)?printf("%lld %lld",l,r):printf("-1");
	return 0;
}

这个C++程序的主要功能是解决一种特殊的线性方程组问题。方程组的形式如下:

n1x + n2y + n3*u = q
x + y + u = p

其中,x, y, u是未知数,p, q, n1, n2, n3是已知的常数。

程序通过遍历查找的方式,在[0, p]的范围内搜索u的值,使得上述方程组有整数解。如果存在这样的u,那么程序会输出u的最小值和最大值;否则,程序会输出"-1"。

函数check(int u)用于检查给定的u值是否满足方程组的整数解条件。它首先检查两个条件,确保两个方程中的y和x都是非负的。然后,如果n2等于n1,它直接计算x和y的值,并检查x+y+u是否等于p。如果n2不等于n1,它会计算y和x的值,并再次检查x+y+u是否等于p。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值