do_while_true

一言(ヒトコト)

「题解」Codeforces 1710C XOR Triangle

\(x=a\operatorname{xor} b,y=b\operatorname{xor} c,z=a\operatorname{xor} c\),则 \(x\operatorname{xor} y\operatorname{xor} z=0\)

即有 \(x\operatorname{xor} y=z\),考虑异或是在做不进位加法,则有 \(x+y>z=x\operatorname{xor} y\Leftrightarrow x\operatorname{and} y\neq 0\)

故数位 dp 记 \(f_{i,0/1,0/1,0/1,0/1,0/1,0/1}\) 表示从高到低填到第 \(i\) 位,\(a,b,c\) 有没有顶到上界(前 \((i-1)\) 位和 \(n\) 一样,以及 \(x\operatorname{and} y,y\operatorname{and}z,x\operatorname{and}z\) 是不是非 \(0\)).

记忆化搜索,很好写。

int solve(int pos,int s1,int s2,int s3,int t1,int t2,int t3){
	if(pos==n+1)
		return t1&&t2&&t3;
	if(vis[pos][s1][s2][s3][t1][t2][t3])
		return f[pos][s1][s2][s3][t1][t2][t3];
	int &now=f[pos][s1][s2][s3][t1][t2][t3];
	vis[pos][s1][s2][s3][t1][t2][t3]=1;
	for(int a=0;a<=min(v[pos]+s1,1);a++)
		for(int b=0;b<=min(v[pos]+s2,1);b++)
			for(int c=0;c<=min(v[pos]+s3,1);c++){
				int p1=s1|(a<v[pos]),p2=s2|(b<v[pos]),p3=s3|(c<v[pos]);
				int x=a^b,y=b^c,z=a^c;
				int q1=t1|(x&&y),q2=t2|(y&&z),q3=t3|(x&&z);
				cadd(now,solve(pos+1,p1,p2,p3,q1,q2,q3));
			}
	return now;
}
posted @ 2022-09-14 16:02  do_while_true  阅读(19)  评论(0编辑  收藏  举报