2018ZUCC程序设计竞赛 J.Dragon

这里写图片描述

题目如图。
写的时候很懵逼,因为按照推出来的公式来看会有不存在的情况,结果瞅了瞅题,除了y<=b和k<=a也没看到什么限制。按照如果不存在输出0给wa掉了就不敢碰这道题了。
也是之后跳提示说题目保证有解才尝试性的把多余的东西删掉交了一发。
队长是二分枚举做的,也正是队长A了这道题我才敢碰(肯定不用管坑)。— △ —

这题怎么做呢,二分我是不知道,反正我是直接解了方程。
甲级龙来源只有龙魔和乙级龙进化两个。
乙级龙来源只有甲级龙繁殖一个,但是它会少,会变成甲级龙。
那么我们设前一天甲级龙为a1,乙级龙为b1。
那么可以得到:
a = a1 + k + b1/y;
b = x*a1 + b1%y;
表达式十分明确。
然后我们联立可以得到:
b = x*(a-k) - (b1/y)*x + b1%y
整理一下得到:
(a-k)*x - b + b1%y = (b1/y)*x
千万注意后面x乘在外面,因为你b1/y是个取整。
也就是说,b1/y一定是个整数,不然这个式子不成立,即不存在这种情况。
所以等式左边除以x一定要是个整数。
我们需要b1最大,需要求等式右边的那个b1,因为左边b1模y是个未知数,b1%y越大b1不一定越大,但是如果b1/y越大b1一定越大。
等式左边(a-k)*x-b是个定值,所以如果要b1越大,b1%y一定要越大,b1%y的取值范围为【0,y-1】,从y-1开始赋值循环,直到等式左边可以把x除尽,算出得数b1。但是如果循环到0都不能被x整除,则说明b1不存在,我一开始卡在了这里,一度以为我推错了公式,但是后来题目保证存在,那么就不用管循环到0没找到的情况了。

代码部分很简单,算上头文件也就二十行,没有任何算法因素存在,我就不贴代码了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值