「题解」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;
}