zoukankan      html  css  js  c++  java
  • 小凯的疑惑

    题目链接

    转化题意: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;
    } 

     


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

    好题哉!!!

  • 相关阅读:
    Java EE部分-- 各框架对比与项目优化
    Java EE部分--Mybatis
    Java EE部分--MVC
    Java EE部分--Hibernate、Struts
    Java EE部分--spring(二)
    Java EE部分--spring(一)
    IO和NIOAIO
    JDK、 反射

    线程(二)
  • 原文地址:https://www.cnblogs.com/qing1/p/11035760.html
Copyright © 2011-2022 走看看