关于转移的正确性
查看原帖
关于转移的正确性
1033727
toolazy楼主2024/7/17 15:45

首先根据大因子排序,不存在大因子则分配不同的标识数,仅做区分用。

参考:

void build(int n) {
	small = 0, big = __cnt ++;// 就是这里的 big, __cnt 一开始的初值可以设成 -n
	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},分别指大因子在左边/右边/不存在f_{i,p,S,T}\Rightarrow考虑前\space i\space个数,左边小因子集合为\space S,右边小因子集合为\space T\\ p\in\{L,R,N\},分别指大因子在左边/右边/不存在

不同段:

fi,N,S,T=∑pfi−1,p,S,T(不包含该数,所以失去了加入自己的决策)fi,L,S,T=∑p(∑S′∪M=Sfi−1,p,S′,T)(包含该数在左边,因为大因子不同所以不影响)fi,R,S,T=∑p(∑T′∪M=Tfi−1,p,S,T′)(包含该数在右边,因为大因子不同所以不影响)\begin{aligned} &f_{i,N,S,T}=\sum_{p}f_{i-1,p,S,T}\hspace{5cm}&\text(不包含该数,所以失去了加入自己的决策)\\ &f_{i,L,S,T}=\sum_{p}\bigg(\sum_{S'\cup M=S}f_{i-1,p,S',T}\bigg)&(包含该数在左边,因为大因子不同所以不影响)\\ &f_{i,R,S,T}=\sum_{p}\bigg(\sum_{T'\cup M=T}f_{i-1,p,S,T'}\bigg)&(包含该数在右边,因为大因子不同所以不影响) \end{aligned}

同段:

fi,N,S,T=fi−1,N,S,T(不包含该质数,不能加自己也不能让别人加)fi,L,S,T=∑p≠R(∑S′∪M=Sfi−1,p,S′,T)(包含该数在左边,只要右边不出现就行;或者不加)+fi−1,L,S,Tfi,R,S,T=∑p≠L(∑T′∪M=Tfi−1,p,S,T′)(包含该数在右边,只要左边不出现就行;或者不加)+fi−1,R,S,T\begin{aligned} f_{i,N,S,T}=&f_{i-1,N,S,T}&\hspace{3cm}(不包含该质数,不能加自己也不能让别人加)\\ f_{i,L,S,T}=&\sum_{p\neq R}\bigg(\sum_{S'\cup M=S}f_{i-1,p,S',T}\bigg)&(包含该数在左边,只要右边不出现就行;或者不加)\\ &+f_{i-1,L,S,T}\\ f_{i,R,S,T}=&\sum_{p\neq L}\bigg(\sum_{T'\cup M=T}f_{i-1,p,S,T'}\bigg)&(包含该数在右边,只要左边不出现就行;或者不加)\\ &+f_{i-1,R,S,T} \end{aligned}

边界:

f1,N,∅,∅=1f1,L,fact[1],∅=1f1,R,∅,fact[1]=1f_{1,N,\varnothing,\varnothing}=1\\ f_{1,L,\text{fact[1]},\varnothing}=1\\ f_{1,R,\varnothing,\text{fact[1]}}=1

感觉这个转移没有问题,但是代码跑出来的结果就是锅掉了 qwq

如果 sort 就能跑 n≤58n\le58,换成 stable_sort 就能跑 n≤68n\le68,正确性到底错哪里了?

2024/7/17 15:45
加载中...