Codeforces Round #689 Div. 2 F. Mathematical Expression

题目链接

官方的 Tutorial 中有这一句话。

If the product of numbers is greater than or equal to 1016, then it is beneficial for us to put the multiplication sign everywhere.

其意思是指在输入为 ±* 或者 +* 时,倘若输入中一段数字的乘积大于1016 ,那么如果把数字之间任何一个*改成+,最后得到的值都不如连乘来的大

为什么连乘起来大于1016时就不用考虑加法呢?
我一开始对这个1016感到困惑,现在在这里给出我自己的看法

自然的,在大部分情况下,乘法产生的值的确比加法来的大
2 + 1 + 2 > 2 ∗ 1 ∗ 2 2+1+2>2*1*2 2+1+2>212 这种操作,直觉上应该是特例
那么是否的确存在像 1016 这样一个界限,我们可以如此处理

先来看一个一般的数列

0 1 1 2 1 9 1 3 4 1 7 5 0

自然的,最开头的 0 或者 1 都是用+去处理,即

0+1+1+2 1 9 1 3 4 1 7 5+0

这样那么最终我们要处理的就是中间这一串数字,要用 + 和 * 使其值最大

2 1 9 1 3 4 1 7 5

注意到形式上的特点,我们把它写的更加一般

a 1 b 1 c 1 d

其中英文字母代表了那些没有 1 的数块,一个数块里面没有 1 ,将这个数块连乘起来自然会比较大,没有必要用加法

接下来我们考虑 1 对我们选取乘法还是加法所带来的影响。

我们先做一个变换

a 1 b 1 c 1 d 变成 a 1 1 1 b c d

也就是把所有的1都前置。
那么这两个数块,连乘的积应该是一样的。
但是,如果存在加法,右边的数块应该来的比左边的大,即
a + 1 + b + 1 + c + 1 + d < = a + 1 + 1 + 1 + b ∗ c ∗ d a+1+b+1+c+1+d<=a+1+1+1+b*c*d a+1+b+1+c+1+d<=a+1+1+1+bcd
当然这只是一种情况,事实上,如果我们把左边式子中任何加号改成称号,我们总可以发现右边的式子来的比较大,因为右边的式子充分利用了 1 和 非1

换句话说,右边的式子是使用加法的最优情况,如果只用乘法的值比右边的式子还要大,那么我们不必再考虑加法。

接下来我们来求这个式子的界限

我们把 a 记作 A,代表一个 [2,9] (非 1 ) 的整数
b ∗ c ∗ d b*c*d bcd 记作B,代表最后那个非 1 数块的连乘起来的值
中间 1 的个数记为 k

那么,我们希望得到
A + k + B < A ∗ B A+k+B<A*B A+k+B<AB
一波操作

k + 1 < ( A − 1 ) ∗ ( B − 1 ) < A ∗ B k+1<(A-1)*(B-1)<A*B k+1<A1(B1)<AB

由于 k 代表了 1 的个数,最多也就是 n=105

也就是说,当数列乘积大于 105 时,我们直接用 * 全乘起来就可以,相比用 + ,连乘的值一定更大。

以上就是个人的想法,欢迎大家批评指正。

至于为什么官方的题解里写了 1016 ,可能时出题人的小心机

当然更大的可能是我的理解出现了问题

总之,倘若输入中一段数字的乘积大于105 ,那么如果把数字之间任何一个*改成+,最后得到的值都不如连乘来的大

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值