前言
特别鸣谢:@Eucatastrophe ,帮我把代码调好了。
其实不调的做法在考场能做,移到这里就炸了,数据问题吧
辉光借楼宣团https://www.acgo.cn/application/2042830309581336576
> 此题解不是正解!能过,但是并没有用到出题人想到的知识点(快速幂)
正文
思路
首先一个小结论(不会证,有证明过程那个题解没了):
对于一个正整数n(n≥2),可以将其分解为:n=p∗2+q∗3(p≥0,q≥0)q越大,2p+3q越大。对于一个正整数n(n\geq2),可以将其分解为:\\ n=p*2+q*3(p\geq0,q\geq0)\\ q越大,2^p+3^q越大。 对于一个正整数n(n≥2),可以将其分解为:n=p∗2+q∗3(p≥0,q≥0)q越大,2p+3q越大。
人话:把一个≥2的数拆成ppp个222和qqq个333,那么qqq越大,这些数的乘积越大。
qqq最大时,2p+3q2^p+3^q2p+3q就是我们要求的最大乘积。
那么怎么找到最大的qqq呢?
反向思考,让ppp最小即可。
也就是:从小到大枚举ppp可能值,当n−2∗pn-2*pn−2∗p满足qqq的条件时,n−2∗p=3∗qmaxn-2*p=3*q_{max}n−2∗p=3∗qmax 。
实现
前置
输入:
这里如果n=1n=1n=1会爆掉,所以加一个特判:
然后是下面的实现(略)
最后是输出:
然后就是核心实现。
朴素实现
考虑简单的暴力,遍历p然后暴力求3^q:
首先遍历p:
> 这里不存储 ppp , qqq , 而是存储n−2∗pn-2*pn−2∗p。
如果这里除完了证明q=0q=0q=0,输出后返回即可。
那么现在3∗q=n−2∗p3*q=n-2*p3∗q=n−2∗p。
然后在ansansans上乘3q3^q3q:
预期分数40pts40pts40pts,实际过点16/2516/2516/25。(水了,考场这么做是4/104/104/10。这个数据很魔幻,低段多然后高段又很高)
瞎搞优化
> 正品是快速幂但是不会。
注意到0≤n≤20\leq n\leq20≤n≤2,所以上面循环-2的部分并不是大头。
但是如果加速3q3^q3q的部分正解需要快速幂,但是考虑到有的人不会快速幂。
但是根据初一上学期知识,na=nb+nc(a=b+c)n^a=n^b+n^c(a=b+c)na=nb+nc(a=b+c)。
所以,我们可以把qqq分解。
参考注释食用。
预计100pts100pts100pts,实际过点25/2525/2525/25。
完整AC代码
后记
你猜我上次Floyd那篇哪去了?答曰写太拉删了。
感谢@Xylophone指出我写的那就是一坨。
Upd 26-4-5:坏了证明那个题解没了。