小凯的疑惑
转化题意:a,b,c∈N*,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;
}
总的来说,此题相对简单,可找规律,也可根据数学来推导。
好题哉!!!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!