2019牛客暑期多校训练营(第七场)H Pair

数位dp。
这次是针对&和^的,所以数位变成了二进制位数。针对二进制从高到低位进行搜索即可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<map>
//#include<regex>
#include<cstdio>
#define up(i,a,b)  for(int i=a;i<b;i++)
#define dw(i,a,b)  for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
int read()
{
    char ch = getchar(); int x = 0, f = 1;
    while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}
typedef pair<int, int> pir;
ll dp[40][3][3][2][2][2][2];
int cnta[40], cntb[40], cntc[40];
int A, B, C, T;
/*za,zb是针对数位0000这样的数字,题目要求大于等1,所以要去除零的影响
ad是and,xr是xor,limit表示是否达到上限*/
ll dfs(int len, int ad, int xr, int limita, int limitb, int za, int zb)
{
    if (len == -1)
    {
        return ((ad > 0) || (xr < 0) && za&&zb);//整个数位dp完
    }
 
    ll &ans = dp[len][ad + 1][xr + 1][limita][limitb][za][zb];//记忆化
    if (ans != -1)return ans;
    int a = limita ? cnta[len] : 1;//上限
    int b = limitb ? cntb[len] : 1;
    ll res = 0;
    upd(i, 0, a)
    {
        upd(j, 0, b)
        {
            res += dfs(len - 1, ad == 0 ? (i&j) - cntc[len]:ad, xr == 0 ? (i^j) - cntc[len]:xr, i == a && limita, j == b && limitb, za | i, zb | j);
        }
    }
    ans = res;
    return res;
}
int main()
{
    T = read();
    while (T--)
    {
        memset(dp, -1, sizeof(dp));
        memset(cnta, 0, sizeof(cnta));
        memset(cntb, 0, sizeof(cntb));
        memset(cntc, 0, sizeof(cntc));
        A = read(), B = read(), C = read();
        dwd(i, 31, 0)
        {
            cnta[i] = (A >> i) & 1; cntb[i] = (B >> i) & 1; cntc[i] = (C >> i) & 1;
        }
        cout << dfs(31, 0, 0, 1, 1,0,0)<<endl;
    }
}
posted @ 2019-08-14 21:22  LORDXX  阅读(165)  评论(0编辑  收藏  举报