【校内模拟】【18-10-31】一串数字 【数论】

题解

1.0 认真分析

对于题目要求的两两权值之积不为0,我们可以在n2的时间内处理出每两个数之间的关系(即能否同时选)。但最后怎么统计答案呢??emmm反正连边跑最长路挂了

以上算法30pts

1.1 正解

那么正解优越在哪里呢??优越在它考虑了一个特殊的性质:

设 v= ∏ i p i a i \prod{_{i} { {pi ^{ai} }}} ipiai ,则将 ai 替换为 ai mod3并不会影响答案。
这样转化后,除了那些为 1 的数,其他的每个 v 一一对应着 v′,这两个数不能同时选取。

这个东西很容易证明,(因为是严格的一次项对应二次项才能凑出三次项),就不多阐述了。

上面提到的是普遍情况,实际做的时候我们还要把本身就是立方数的数拿出来单独考虑。因为所有的立方数里面你只能选一个,所以我们就贪心选最大的那个。

那么对于剩下的,v和v’只能选一个,还是贪心选大的那个。因为你会发现每一对之间的决策对别的决策没有影响啊~

最后落实到代码实现上,我们要怎么存下v和v’呢?

我们设定v<v’,当我们算到v的时候就可以顺便计算出v’(具体实现看代码),自然算v’也会得到v。因此我们开两个数组c[i]和d[i],v=i的贡献存在c[v]里,然后把这个v对应的v’的贡献存在d[v]里,最后统计答案只需要扫一遍,在c[i]和d[i]里拿最大值就可以啦~

总结

主要是数学规律的问题,其次这个c数组和d数组的使用也比较巧妙,值得学习。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值