题解
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数组的使用也比较巧妙,值得学习。