• 【NOIP2017】小凯的疑惑


    原题:

    小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。

    a,b<=10^9

    结论题,记得我当时在现场大力打表做出来了

    听说好像还是小学奥数题

    不过数论推结论不难

    由裴蜀定理及其引理,因为gcd(a,b)=1,所以对于任意整数c,都存在整数x和y满足ax+by=c

    既然丢番图方程有解,为什么还会存在不能支付的价格?

    因为丢番图方程允许有负解,但是支付的时候不能付负数的钞票(那样大概算找钱吧)

    所以目标转化为,寻找最大的整数c,使得不存在非零整数x和y,满足ax+by=c

    联想到解丢番图方程时对于负解向正解的转化

    丢番图方程存在通解:x0+k*(b/d),y0-k*(a/d),其中d=gcd(a,b)

    那么可以发现存在C使得当c>C时方程有正整数解的原因

    因为当c很大,x0就可以很大,那么即使y0是负值,也能通过让x0减少,y0增加的方式调整,使得x0和y0都是赋值

    这启发我们找到一个思路:对于一个正整数x0,检查所有不能通过调整来达到整数的y0的特点

    因为d=1,所以方程的通解实际为x0-k*b,y0+k*a

    x0在保证自身不为负的情况下最多给y0提供⌊x0/b⌋*a

    当y0+⌊x0/b⌋*a<0,也就是y0<-⌊x0/b⌋*a时,a*x0+b*y0=c没有正整数解

    则c<=a*x0+b*(-⌊x0/b⌋*a-1)=a*x0-a*b*⌊x0/b⌋-b=a*(x0-b*⌊x0/b⌋)-b=a*(x0%b)-b

    由于x0是任意正整数,所以x0%b的最大值为b-1

    所以c的最大值为a*(b-1)-b=a*b-a-b

    代码就两行,不贴了

  • 相关阅读:
    Python(3)---从迭代器到异步IO
    并发访问sqlite数据库出现databse is locked的错误的一个解决办法
    基础概念2
    (已解决)Arduino mega2560 R3插在电脑上没有反应
    <Android 基础(二)> BroadcastReceiver
    unicode字符和多字节字符的相互转换接口
    PHP中XML和数组互相转换的方法
    java网络编程—TCP(1)
    Java EE的十三个技术规范
    <Android 基础(一)> Service
  • 原文地址:https://www.cnblogs.com/cdcq/p/11619920.html
Copyright © 2020-2023  润新知