【提高组NOIP2017】小凯的疑惑 通俗分析 咱们不数论

      考场上我为了这道题目抓耳挠腮了一个小时无果,无奈只好写了个30分的暴力,事后才知道这居然是一个小学奥数问题。。。好吧,可能我是个假的高中生。。。

      废话不多说,上原题:

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

例:如果小凯手中有面值为3和7的金币无数个,在不找零的前提下无法准确支付价值为1、2、4、5、8、11 的物品,其中最贵的物品价值为 11,比 11 贵的物品都能买到比如:

12 = 3*4 + 7*0

13 = 3*2 + 7*1

14 = 3*0 + 7*2

15 = 3*5 + 7*0

……

又比如两个金币的面值如果是3和10,那么最大无法支付的价值为17。

 

      嗯。。。其实做这道题并不需要什么特别的算法,只需要找规律,把它们的数学关系找出来,数论厉害的当然可以用数论推,但我的数论不厉害,所以就推不出来了,只能找规律

      在遵循题目规则的前提下(a, b互质,且一定有凑不出来的数),打表的时候要注意打得要也有一定规则,这样有助于我们分析,比如,我们多列几组数据的时候,假设ab其中一个数不变,就另一个数递增,然后尽可能得从简单的开始列,比如可以:

(2, 3) -> 1

(2, 5) -> 3

(2, 7) -> 5

(2, 9) -> 7

 

(3, 4) -> 5

(3, 5) -> 7

(3, 7) -> 11

(3, 8) -> 13
……

从打表我们可以看出(赛场上多数人都是靠看出)这些都符合一个公式:(a, b) = a*b-(a+b)


      公式我们拿到了,接下来就是证明公式的正确性,不然我们用得也不放心,下面是这个公式的白话证明:

      请记住: a和b互质

      a*b - a 可看作是由a*b少了个a,这个数可以由(b-1)个a凑成,但由于a*b能被b整除,而a*b-a则是在a*b基础上少了个a而已,根据a与b互质的关系,我们很容易能想到只用b是凑不出a*b-a的,假设b大于a,强行用a个b去凑也只能凑出a*b而这跟a*b-a差了一个a,无论用b怎么凑都不能把多出来的a这个差距消掉,所以光用b凑不成,设b小于a也是同理。

      a*b - (a+b)即为a*b - a - b,我们进一步化成(a*b-a) -b,这时我们可以发现这是在a*b-a的基础上又少了一个b,那么这样光用a也没办法凑出(a*b-a) -b这个数了,用b就更不用说了,有没有可能用若干个a跟若干个b一起凑出来?不行,设b大于a,我们在前面推出来了如果用b去凑(a*b-a) 会多出来a,那么用b凑(a*b-a) -b自然也是多出来a,因为你不可以有-1个a,所以想凑数的话只能慢慢一个一个挪走b,然后用a去凑空缺,看能不能补上。这个我们可以模拟一下,先强行用b去凑(a*b-a) -b,上面说过了,会比(a*b-a) -b多出a来,挪数开始,挪走一个b,会有(b-a)这个缺口产生,这个靠a没法补上,挪走2个b,会有(2b-a)这个缺口产生,靠a还是没法补上,挪走3个b...一直到挪走a个b,我们发现这时才有可以填上的第一个缺口(a*b-a),即(b-1)*a,可以用(b-1)个a补上,可是a*b-(a+b)哪里来的a个b给你挪开。。。

      证毕

 

      证明完成了,那么我们就可以开心地拿公式去代入做题了,不过问题又来了,看看数据限制,a,b最大可以有10^9,也就是说a*b会达到10^18这么恐怖的数据规模,直接用long long能装得下吗?要不要用高精度啊?

      这就考验我们的对数据类型范围的了解程度了,事实上,long long的最大值9223372036854775807细细一数,正好19位,也就是说,10^18这个数用long long是完全没问题的,AC这道题确实是只需三行代码,定义,输入,代入公式输出(史上最水,没有之一),可是很多NOIP选手因为对数据范围不够了解,为了保险只好写高精度,这里就浪费了很多时间,跟我此次同行NOIP的一个校友,写高精度写了一个小时还没写对,一怒之下就把代码全删掉,换上那三行代码,结果反而让他“不小心”AC了,但是不管怎么说也是浪费了一个小时啊!一个小时在考场上什么概念就不用多说了吧!

 

       这次的题主要就是考验我们的思维能力跟我们对数据范围的准确理解,所以大家要重视平常知识的累积,像数据范围这类跟我们正式考试息息相关的还是要有充分的认识好。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值