2019牛客多校第六场H Pair(数位DP 多个数相关)题解
题意:
传送门
给你\(A,B,C\),要求你给出有多少对\((x, y)\)满足\(x\in [1,A],y\in [1,B]\),且满足以下任意一个条件:\(x \& y > C\)或者\(x \oplus y < C\)。
思路:
数位\(DP\),以前做的数位\(DP\)只是和一个数相关,今天是和两个数相关,有点神奇。这里我开了九维,第\(i\)位\(x\)是\(j\),\(y\)是\(k\),对\(第一种\)情况,对\(第二种\)情况,\(x\)到达上界,\(y\)到达上界,\(x\)前导零,\(y\)前导零。一开始只开了前五维,但是\(T\)了。因为在二进制中,其中一个数达到上界的情况其实非常多,那么如果我每次都要求\(!limita\ \&\&\ !limitb\)时才返回\(dp\)那么势必造成很多情况都要\(dfs\)很多次求解。前导零同理。
代码:
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<cmath>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 100000 + 5;
const int INF = 0x3f3f3f3f;
const ull seed = 131;
const ll MOD = 1e9 + 7;
using namespace std;
ll dp[40][3][3][3][3][3][3][3][3]; //第i位x是j,y是k,对第一种情况,对第二种情况,x到达上界,y到达上界,x前导零,y前导零
//0不知 1不满足 2满足
int bit1[40], bit2[40], C;
//x and y > C
//x xor y < C
ll dfs(int pos, int x, int y, int oxor, int oand, int stx, int sta, bool limita, bool limitb, bool leadx, bool leady){
    if(pos == -1){
        if((stx == 2 || sta == 2) && !leadx && !leady) return 1;
        return 0;
    }
    if(dp[pos][x][y][stx][sta][limita][limitb][leadx][leady] != -1) return dp[pos][x][y][stx][sta][limita][limitb][leadx][leady];
    int top1 = limita? bit1[pos] : 1;
    int top2 = limitb? bit2[pos] : 1;
    ll ret = 0;
    for(int i = 0; i <= top1; i++){
        for(int j = 0; j <= top2; j++){
            int nxor = (oxor << 1) + (i ^ j), nand = (oand << 1) + (i & j);
            int nstx = stx, nsta = sta;
            if(stx == 0 && nxor > (C >> pos)){
                nstx = 1;
            }
            else if(stx == 0 && nxor < (C >> pos)){
                nstx = 2;
            }
            if(sta == 0 && nand > (C >> pos)){
                nsta = 2;
            }
            else if(sta == 0 && nand < (C >> pos)){
                nsta = 1;
            };
            ret += dfs(pos - 1, i, j, nxor, nand, nstx, nsta, limita && i == top1, limitb && j == top2, leadx && !i, leady && !j);
        }
    }
    dp[pos][x][y][stx][sta][limita][limitb][leadx][leady] = ret;
    return ret;
}
ll solve(int A, int B){
    int pos = 0;
    if(A < B) swap(A, B);
    while(A){
        bit1[pos] = A & 1;
        A >>= 1;
        bit2[pos++] = B & 1;
        B >>= 1;
    }
    ll ans = dfs(pos - 1, 0, 0, 0, 0, 0, 0, true, true, true, true);
    return ans;
}
int main(){
    int T;
    scanf("%d", &T);
    while(T--){
        memset(dp, -1, sizeof(dp));
        int a, b;
        scanf("%d%d%d", &a, &b, &C);
        ll ans = solve(a, b);
        printf("%lld\n", ans);
    }
    return 0;
}
												
											2019牛客多校第六场H Pair(数位DP 多个数相关)题解的更多相关文章
- 2019牛客多校第七场H Pair 数位DP
		
题意:给你一个3个数A, B, C问有多少对pair(i, j),1 <= i <= A, 1 <= j <= B, i AND j > C或 i XOR j < ...
 - 牛客多校第七场H Pair 数位dp理解
		
Pair 题意 给出A B C,问x取值[1,A]和y取值[1,B]存在多少组pair<x,y>满足以下最小一种条件,\(x \& y >c\),\(x\) xor \(y& ...
 - 2019牛客多校第六场 B - Shorten IPv6 Address 模拟
		
B - Shorten IPv6 Address 题意 给你\(128\)位的二进制,转换为十六进制. 每\(4\)位十六进制分为\(1\)组,每两组用一个\(":"\)分开. 每 ...
 - [题解]Shorten IPv6 Address-模拟(2019牛客多校第六场B题)
		
题目链接:https://ac.nowcoder.com/acm/contest/886/B 题意: 您将获得一个IPv6地址,该地址是128位二进制字符串.请根据以下规则确定其最短的表示: 以十六进 ...
 - 2019牛客多校第六场J-Upgrading Technology(枚举+单调队列)
		
Upgrading Technology 题目传送门 解题思路 对于这题,我们可以枚举一个k从0~m,表示当前我们把所有技能最少升到了k级,且至少有一个为k级. 此时我们刚好获得了前k个d[]的收益, ...
 - 2019 牛客多校第六场 D Move
		
题目链接:https://ac.nowcoder.com/acm/contest/886/D 题解摘自官方题解 题目大意 有 K 个体积相同的箱子,有 N 个体积相同或相异的物品,现要按照如下策略装箱 ...
 - 2019 牛客多校第六场 J Upgrading Technology
		
题目链接:https://ac.nowcoder.com/acm/contest/886/J 题目大意 略. 分析 见代码. 代码如下 #include <bits/stdc++.h> u ...
 - 2019 牛客多校第六场 B Shorten IPv6 Address
		
题目链接:https://ac.nowcoder.com/acm/contest/886/B 题目大意 给定一个 128 位的二进制 ip 地址,让你以 16 位一组,每组转成 16 进制,用冒号连接 ...
 - [题解]Magic Line-计算几何(2019牛客多校第三场H题)
		
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示 ...
 
随机推荐
- mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String
			
犯了一个低级的错误,在传集合类型的参数时,把他当成字符串处理了,导致报类型转换的错误 把 and nsrsbh!=' ' 删掉就行了
 - linux  opt, usr文件夹说明
			
linux下各文件夹介绍: https://www.pathname.com/fhs/pub/fhs-2.3.html /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为 ...
 - windows上传ipa到苹果开发者中(app store)的方法
			
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开发者中心才能在构建版本里选择构建版本上架 ...
 - Windows Server 2008 R2系统安装
			
把系统U盘插到服务器上,然后启动服务器进入BIOS界面选择U盘启动. 根据服务器的不同,进入BIOS界面的按钮也不一样,主流的有F10.F11.F12.F2.ESC.delete等. 在从BIOS启动 ...
 - 琐碎的想法(三)对Java的批评的看法
			
编写本文的目的 在大环境下,Java是一个饱受争议的语言,一方面在工程上它的流行程度非常高:另一方面,越是资深的软件工程师就越容易对这个语言感到不满. 在这种情况下,博主希望每一个Java程序员能够耐 ...
 - circus reload
			
circus reload Configuration - Circus 0.15.0 documentation https://circus.readthedocs.io/en/latest/fo ...
 - libco协程原理简要分析
			
此文简要分析一下libco协程的关键原理. 在分析前,先简单过一些协程的概念,以免有新手误读了此篇文章. 协程是用户态执行单元,它的创建,执行,上下文切换,挂起,销毁都是在用户态中完成,对linux系 ...
 - C# 8.0 可空(Nullable)给ASP.NET Core带来的坑
			
Nullable reference types(可为空引用类型) 可为空引用类型不讲武德 C#8.0 引入了"可为空引用类型"和"不可为空引用类型",使我们能 ...
 - 圣诞快乐!OIer挂分小技巧
			
OIer常犯错误 自己的错误 循环里套return 线段树求和 int 定义,下传 int 定义 cmp<,>号分不清 主观行为举动错误 踢电源线,注意安全(_Destiny) TLE 大 ...
 - 五万字长文带你学会Spring
			
Sping Spring概念介绍 spring是啥呢,你在斗地主的时候把别人打爆了那叫spring, 你成功的追到了你爱慕已久的女神,人生中的春天来了,那也叫sping 好了别看我老婆了,咱来讲讲啥是 ...