考虑题目转化,二进制下满足 i ⊆ j , ( i + x ) ⊆ ( j + y ) i\subseteq j,(i+x)\subseteq (j+y) i⊆j,(i+x)⊆(j+y)
这显然是个数位dp形式
考虑枚举每一位与进位, d p k , p 1 , p 2 dp_{k,p_1,p_2} dpk,p1,p2 表示第 k − 1 k-1 k−1 位向第 k k k 位,分别进位 p 1 , p 2 p_1,p_2 p1,p2 的方案数
考虑当前 ( i , j ) (i,j) (i,j) 二进制下分别为 q 1 , q 2 q_1,q_2 q1,q2,则 ( i + x , j + y ) = ( p 1 + q 1 + x i , p 2 + q 2 + y i ) = ( n 1 , n 2 ) (i+x,j+y)=(p_1+q_1+x_i,p_2+q_2+y_i)=(n_1,n_2) (i+x,j+y)=(p1+q1+xi,p2+q2+yi)=(n1,n2)
必须满足 q 1 ⊆ q 2 , n 1 & 1 ⊆ n 2 & 1 q1\subseteq q2,n1\&1\subseteq n2\&1 q1⊆q2,n1&1⊆n2&1,由 d p ( i + 1 , n 1 2 , n 2 2 ) dp(i+1,\frac{n_1}2,\frac{n_2}2) dp(i+1,2n1,2n2) 转移过来
综上:
d p ( k , i , j ) = ∑ q 1 ⊆ q 2 , n 1 = p 1 + q 1 + x i , n 2 = p 2 + q 2 + y i [ n 1 & 1 ⊆ n 2 & 1 ] d p ( i + 1 , n 1 2 , n 2 2 ) \Large dp(k,i,j)=\sum_{q1\subseteq q2,n1=p1+q1+x_i,n2=p2+q2+y_i}[n1\&1\subseteq n2\&1]dp(i+1,\frac{n_1}2,\frac{n_2}2) dp(k,i,j)=q1⊆q2,n1=p1+q1+xi,n2=p2+q2+yi∑[n1&1⊆n2&1]dp(i+1,2n1,2n2)
dp[n][0][0].a[1]=1;
for(i=n-1; i>=0; --i) {
for(p1=0; p1<=1; ++p1) for(p2=0; p2<=1; ++p2) {
for(q1=0; q1<=1; ++q1) for(q2=q1; q2<=1; ++q2) {
n1=p1+q1+x[i]; n2=p2+q2+y[i];
if(n1%2>n2%2) continue;
dp[i][p1][p2]=dp[i][p1][p2]+dp[i+1][n1/2][n2/2];
}
}
}
dp[0][0][0].print();