一些必要的优化

一、求找到某个数的所有素因子:

自己的做法:使用一个vector,在筛素数的时候,将当前素数i,放入vec[j],其中j为i的倍数。这样如果询问很多,则是一个可行的方法。但是如果询问较少,空间和时间花费都会很大。

优化做法:筛素数的时候,对于每个数,只需要记录它的最小(或最大)的素因子就行了。查询的时候,每次都除以当前数的最小的素因子,然后更新当前数,继续往下找。这样,就能找到所有的素因子了。这种方法对于询问次数较少的题目,将会比第一种做法快上很多。

 

二、假如已知当前的一个二进制状态sta,求其所有子状态s1,s2使(s1&s2)==0 && (s1|s2)=sta。

自己的做法:

(1)dfs搜索。对于状态sta,若某一位i上为1,则枚举子状态s1的第i为为0或者为1。s2=sta^s1。搜出所有情况。

(2)使用lowbit找出所有sta为1的位数,然后逐位枚举,跟搜索差不多,只是换成2进制枚举的写法。

优化做法:直接贴代码好了i为sta,j为s1。

        for (int i = 1; i < (1 << (n - 1)); i++) {
            for (int j = i; j; j = (j - 1) & i) {
                tot++;
            }
        }

 三、对于mod运算,能不用就不用。因为它带来的常数复杂度会有很大可能导致TLE。

posted @ 2013-08-03 20:40  phk52  阅读(129)  评论(0编辑  收藏  举报