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

题解

1.0 认真分析

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

以上算法30pts

1.1 正解

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

设 v= ipiai\prod{_{i} { {pi ^{ai} }}} ,则将 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数组的使用也比较巧妙,值得学习。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章