首先根据大因子排序,不存在大因子则分配不同的标识数,仅做区分用。
参考:
void build(int n) {
small = 0, big = __cnt ++;
for (int p = 2; p <= 19 && p * p <= n; p ++) {
if (n % p) continue;
small |= 1 << ranks[p];
while (n % p == 0) n /= p;
}
if (n != 1) {
if (n > 19)
big = n;
else
small |= 1 << ranks[n];
}
}
fi,p,S,T⇒考虑前 i 个数,左边小因子集合为 S,右边小因子集合为 Tp∈{L,R,N},分别指大因子在左边/右边/不存在
不同段:
fi,N,S,T=p∑fi−1,p,S,Tfi,L,S,T=p∑(S′∪M=S∑fi−1,p,S′,T)fi,R,S,T=p∑(T′∪M=T∑fi−1,p,S,T′)(不包含该数,所以失去了加入自己的决策)(包含该数在左边,因为大因子不同所以不影响)(包含该数在右边,因为大因子不同所以不影响)
同段:
fi,N,S,T=fi,L,S,T=fi,R,S,T=fi−1,N,S,Tp=R∑(S′∪M=S∑fi−1,p,S′,T)+fi−1,L,S,Tp=L∑(T′∪M=T∑fi−1,p,S,T′)+fi−1,R,S,T(不包含该质数,不能加自己也不能让别人加)(包含该数在左边,只要右边不出现就行;或者不加)(包含该数在右边,只要左边不出现就行;或者不加)
边界:
f1,N,∅,∅=1f1,L,fact[1],∅=1f1,R,∅,fact[1]=1
感觉这个转移没有问题,但是代码跑出来的结果就是锅掉了 qwq
如果 sort 就能跑 n≤58,换成 stable_sort 就能跑 n≤68,正确性到底错哪里了?