Processing math: 100%

小凯的疑惑

题目链接

转化题意:a,b,cN*,a*x+b*y=c,求最大的c0,使c=c0时,方程无非负整数解,且对任意的c>c0,都有非负整数解。

首先,考虑x,分段求出x的取值范围。x<0时,不符合题意。x=0时,c0无限大。x=b时,c需满足为b倍数,因而c0无限大,不考虑。x>b时,可转化为x<b的情况。

所以,我们可以很轻易地得到:x[1,b-1]。从而继续思考。


 

因为我们要c0最大,则让x最大,等于b-1。因为方程无非负整数解,所以y<0。那么我们让y=-1,可知:c0=a*b-a-b。

下面来严谨证明:

当c>a*b-a-b时,a*x+b*y>a*b-a-b。b*y>a*b-a-b-a*x≥a*b-a-b-a(b-1)=-b。则:b*y>-b,y>-1。即:有非负整数解。

上面证明当c>a*b-a-b时,方程成立,下面证明当c=a*b-a-b时,原方程不成立。

a*x+b*y=a*b-a-b

a*b=a*(x+1)+b*(y+1)

所以说,b|(x+1)且a|(y+1)。

整除其实相当于小于等于号,所以可得:b≤x+1,a≤y+1。

a*b=a*(x+1)+b*(y+1)≥a*b+a*b=2a*b

a*b≥2a*b,a*b≤0,

方程无非负整数解。

注意:a,b范围为1E+9,int会炸,需开long long。

见代码:

复制代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    long long a,b;
    cin>>a>>b;
    cout<<a*b-a-b;
    return 0;
} 
复制代码

 


总的来说,此题相对简单,可找规律,也可根据数学来推导。

好题哉!!!

 

posted @   青殇  阅读(262)  评论(1编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示