传送门

文章目录

  • 题意:
  • 思路:

题意:

问你有多少对x,yx,yx,y满足以下条件:
(1)x∈[0,A],y∈[0,B](1)x \in [0,A],y\in [0,B](1)x∈[0,A],y∈[0,B]
(2)∣x−y∣≤K(2)|x-y|\le K(2)∣x−y∣≤K
(3)xxory≤W(3)x \ \ xor \ \ y\le W(3)x  xor  y≤W

其中A,B,K,W≤1e9A,B,K,W\le 1e9A,B,K,W≤1e9。

思路:

明显的数位dpdpdp了,考虑怎么设计状态。
众嗦粥汁,数位dpdpdp的状态是要能表现出数的状态和结构的,分别分析一下这三个条件就好啦。
对于第一个条件,我们维护两个变量flag1,flag2flag1,flag2flag1,flag2表示能否达到上界就好啦,很套路。
对于第二个条件,我们自然的想到拆掉绝对值,变成x−y+K≥0,y−x+K≥0x-y+K\ge0,y-x+K\ge0x−y+K≥0,y−x+K≥0,由于我们需要按照二进制来考虑(因为有异或), 所以我这两个式子的值域都为[−1,2][-1,2][−1,2],所以我们分别用两个变量k1,k2k1,k2k1,k2表示这两个式子是多少。考虑是否每个状态都有意义呢?这里只考虑k1k1k1,当k1≤−2k1\le-2k1≤−2的时候,由于我们加上当前位的[−1,2][-1,2][−1,2]中某一个数之前需要乘222(因为从高位到低位),那么无论如何,这个值只会越来越小,所以如果k≤−2k\le-2k≤−2的时候直接返回000即可。对于大于000的状态,无论如何都不会变小,我们为了节省空间将其与222取一个minminmin即可。
对于第三个条件,记一个变量为flag3flag3flag3,表示WWW是否达到上界,也就是说x,yx,yx,y的异或值可以任意。

分析完之后就是数位dpdpdp裸题辣。

// Problem: Xor
// Contest: HDOJ
// URL: http://acm.hdu.edu.cn/showproblem.php?pid=6899
// Memory Limit: 524 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int a,b,k,w;
int A[210],B[210],K[210],W[210];
LL f[100][2][2][2][10][10];
//pos a<=A,b<=B,a^b<=W,x-y+k>=0,y-x+k>=0LL dp(int pos,int flag1,int flag2,int flag3,int k1,int k2) {if(pos==-1) return k1>=0&&k2>=0;if(k1<-1||k2<-1) return 0;k1=min(2,k1); k2=min(2,k2);if(f[pos][flag1][flag2][flag3][k1+1][k2+1]!=-1) return f[pos][flag1][flag2][flag3][k1+1][k2+1];int x=flag1? 1:A[pos];int y=flag2? 1:B[pos];int z=flag3? 1:W[pos];LL ans=0;for(int i=0;i<=x;i++) {//afor(int j=0;j<=y;j++) {//bif((i^j)>z) continue;ans+=dp(pos-1,flag1||i<x,flag2||j<y,flag3||((i^j)<z),k1*2+i-j+K[pos],k2*2+j-i+K[pos]);}}return f[pos][flag1][flag2][flag3][k1+1][k2+1]=ans;
}LL solve() {for(int i=30;i>=0;i--) {A[i]=a>>i&1;B[i]=b>>i&1;K[i]=k>>i&1;W[i]=w>>i&1;}return dp(30,0,0,0,0,0);
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);int _; scanf("%d",&_);while(_--) {memset(f,-1,sizeof(f));scanf("%d%d%d%d",&a,&b,&k,&w);printf("%lld\n",solve());}return 0;
}
/**/

hdu 6899 Xor 数位dp相关推荐

  1. HDU - 6899 Xor(数位dp)

    题目链接:点击查看 题目大意:给出四个整数 A , B , K , W ,问满足下列条件的二元对的个数: x , y 是整数 x <= A , y <= B abs( x - y ) &l ...

  2. HDU 3555 Bomb (数位DP)

    数位dp,主要用来解决统计满足某类特殊关系或有某些特点的区间内的数的个数,它是按位来进行计数统计的,可以保存子状态,速度较快.数位dp做多了后,套路基本上都差不多,关键把要保存的状态给抽象出来,保存下 ...

  3. HDU 3652 B-number (数位DP)

    Description 统计区间\([1,n]\)中是\(13\)的倍数且数字中含有"13"的数的个数. Input 多组用例,处理到文件尾.每组用例给出一个整数\(n\).\(1 ...

  4. HDU - 3555 Bomb(数位dp)

    题目链接:点击查看 题目大意:给定一个整数n,求从1到n的闭区间内含有相邻"49"的数字的个数. 题目分析:裸的数位dp,这里说一下两种做法,第一种是正着求,也就是求含有49的数字 ...

  5. HDU.3652.B-number(数位DP)

    题目链接 \(Description\) 求\([1,n]\)中十进制表示包含"13"这个子串,且能整除13的数的个数. \(Solution\) 数位DP: dp[位][s(pr ...

  6. HDU odd-even number 数位dp

    题意 在l到r区间内求有多少个符合条件"当前数中所有连续的奇数长度是偶数 所有连续的偶数长度是奇数"的个数 分析 典型的数位dp问题 我们设置dp数组时可以根据 dp[pos][p ...

  7. 不要62 HDU - 2089【数位dp】

    不要62 HDU - 2089 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以 ...

  8. Bomb HDU - 3555【数位dp】

    Bomb HDU - 3555 The counter-terrorists found a time bomb in the dust. But this time the terrorists i ...

  9. hdu 3652 B-number 数位dp

    题目链接 求出1-n中包含13并且能被13整除的数的个数 开一个四维数组dp[i][j][k][l], i表示第i位, j表示这个数mod13, k表示是否包含13, l表示前一位是什么. 1 #in ...

最新文章

  1. 求二维数组最大子数组
  2. 小波矩特征提取matlab代码
  3. vue教程4:自定义组件的使用
  4. [C#]泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,ListT,DictionaryTkey,Tvalue,SortedListTkey,Tvalue,...
  5. Vue.js2.0开发环境搭建(一)
  6. 不要手贱自己去通过Javascript画html界面
  7. java多线程教程_java 基础教程之多线程详解及简单实例
  8. 【360开源】2018开源项目汇总
  9. 2009年即将过去,准备迎接2010
  10. python界面开发工 跨平台具_python GUI开发常用工具
  11. 有没有更好的写v =(v == 0?1:0)的方法; [关闭]
  12. java实现贪吃蛇小游戏(源码+注释)
  13. excel 多行 取消隐藏_如何在Excel 2013中隐藏和取消隐藏行和列
  14. 近来开发工作不忙,零零散散整理的Java基础
  15. EDM数据营销之HTML模板相关问题
  16. OAuth2.0 - 自定义模式授权 - 短信验证码登录
  17. 【线代】矩阵的秩(秩:非零子式的最高阶数)
  18. el-form表单添加自定义验证
  19. Python文件的打开和关闭
  20. Calculate a+b

热门文章

  1. 中国大学mooc慕课python语言程序设计答案_中国大学MOOC(慕课)_Python语言程序设计基础_网课答案...
  2. 励志!送女儿去厦大读研后,爸爸回家就考了厦大的博士,现在是女儿的“学弟”...
  3. 最诡异数学悖论:1+1=1
  4. 从小一看到数字,脑子里就开始搞颜色......
  5. 为什么现在老师这么难,值得大家深思
  6. 读书笔记-互联网思维必读10本书之一《免费》
  7. c语言长整数转化为16进制字符串,一个30位的字符串十进制长整数怎么转换为对应的十六进制和八进制...
  8. php左连接,如何在php中对左联接查询返回的数组数据进...
  9. c语言中文件如何插入数据,急求如何将下列C语言程序数据存储到文件中?
  10. armv7的linux系统,CentOS 7(1611) for ARM(armhfp)发布