CF64 C. Lucky Tickets

      一做CF发现自己太水了,这题想了很久,想过几次无果后终究是看了watashi的程序,。。。不懂的太多了,要加紧学习了。

      如果a*b=rev(a)*rev(b)(其中rev(b)为b的逆序,从低位写到高位),那么(a,b)是幸运的组合。现在输入maxx(<=10^5),maxy(<=10^5),w(<=10^8),问是否存在x,y,使得所有i<=x,j<=y(其中所求x<=maxx,y<=maxy)时(i,j)是幸运组合的个数>=w,不存在输-1,存在输出x*y最小的那种情况?

      我们开始以为只有a=rev(a)的组合或b=rev(a)这两种情况,但喵呜提出了一组数据(12,42),这不属于上面的情况,这时就除最大公约数求得最简比值,然后同一比值的就可以任意组合了。想把同一比值的数目存起来,不仅会超空间而且y还不确定,无果了。。。

      看别人的做法,很容易理解。可以很容易发现幸运组合有单调性,随着x或y的增大,幸运组合的个数是递增的。所以可以先求出y=maxy时满足上述条件的最小的x,然后减小y时,增加x,求得最小的x*y。。。

      那么关键问题就是怎么算幸运组合的个数了?开始对于y=maxy,所有<=maxy的i与rev(i)的最简比值可以算出(用pair存最简比值,map存那个最简比值的个数),然后枚举i,对于某个i,可以与i组成幸运组合的j可以通过rev(j)与j的最简比值的个数求得。

      不会STL,这题很难做,所以学习STL去。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值