P3951,jzoj5473-小凯的疑惑【数论】(NOIP2017提高组)

本文探讨了给定两种互质币值时,无法通过这两种货币组合支付的最大金额的数学问题。利用数学证明展示了如何找到该最大值,并提供了一段简单的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正题

评测记录:
https://www.luogu.org/recordnew/show/8283818


大意

两个币值(互质正整数),求不能完全(需要找零)的最贵的东西。


解题思路

首先众所周知ax+by=c而且a和b互质的正整数,c为正整数那么x和y一点有整数解
证明:

证明:因为x0,y0是方程①的整数解,当然满足ax0+by0=c,②
因此a(x0-bt)+b(y0+at)=ax0+by0=c.
这表明x=x0-bt,y=y0+at也是方程①的解.
设x′,y′是方程①的任一整数解,则有
ax′+by′=c.③
③-②得
a(x′-x0)=b′(y0-y′).④
∵a,b是互质的正整数即(a,b)=1,
∴即y′=y0+at,其中t是整数.将y′=y0+at代入④,即得x′=x0-bt.
∴x′,y′可以表示成x=x0-bt,y=y0+at的形式,
∴x=x0-bt,y=y0+at表示方程①的一切整数解.

这道题可以求的就是
ax+bymax{k}(0x,y)ax+by≠max{k}(0⩽x,y)
所以我们就是要求x<0   or   y<0x<0   or   y<0使ax+byax+by最大
那么我们假设a>ba>b
那么x=1x=−1ax+byax+by最大
此时axbax−b,而此时xx取最大值使整个式子最大
最后最大值是(b1)ab(b−1)a−b,因为当x=bx=b时可以合并同类项变为(a1)b(a−1)b就可以进行表示了
然后(b1)ab=abab(b−1)a−b=ab−a−b
然后如果b>ab>a推的话是一样的结果


代码

#include<cstdio>
using namespace std;
long long a,b;
int main()
{
    scanf("%lld%lld",&a,&b);
    printf("%lld",a*b-a-b);
}

转载于:https://www.cnblogs.com/sslwyc/p/9286992.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值