小凯的疑惑

题目链接

转化题意:a,b,c$in$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$in$[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;
} 

 


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

好题哉!!!

原文地址:https://www.cnblogs.com/qing1/p/11035760.html