题面

JZM 想要创造两个数字 x 和 y,它们需要满足 x or y = T,且Lx ≤ x ≤ Rx, Ly ≤ y ≤ Ry,JZM 想知道 x and y 有多少种可能的不同的取值。若有多组 (x, y) 有相同的 x and y 的取值,则只算一次。

0 ≤ T,Lx,Rx,Ly,Ry < 260.

Sample Input
11 3 10 8 13
Sample Output
7

题解

看上去貌似是数位 DP,于是我们就设计一个 DP:

d

p

[

i

]

[

s

1

]

[

s

2

]

[

s

3

]

[

s

4

]

dp[i][s_1][s_2][s_3][s_4]

dp[i][s1​][s2​][s3​][s4​] 表示[当前转移到第

i

i

i 位,

x

x

x 是/否达到下界,

x

x

x 是/否达到上界,

y

y

y 是/否达到下界,

y

y

y 是/否达到上界]时

x and y

\text{x and y}

x and y 有多少种不同的取值。

然后观察样例,我们发现这不好转移,原因是本质相同的一种与值很容易计算多次。我们如果能保证当前位与值为 1 时和为 0 时两种情况能唯一转移到其它状态,这样就能保证不重复。但是如果当前位与值为 0 ,

x

,

y

x,y

x,y 可以是

0 & 1

\text{0 \& 1}

0 & 1,

1 & 0

\text{1 \& 0}

1 & 0 或

0 & 0

\text{0 \& 0}

0 & 0,而三种情况

{

s

1

,

s

2

,

s

3

,

s

4

}

\{s_1,s_2,s_3,s_4\}

{s1​,s2​,s3​,s4​} 结果不一样,那么就不可避免的要么计算重复,要么计算缺失了。

如果说这种情况能唯一对应一个状态的话,那就是状态集

{

{

s

1

,

s

2

,

s

3

,

s

4

}

1

,

{

s

1

,

s

2

,

s

3

,

s

4

}

2

,

.

.

.

}

\{\{s_1,s_2,s_3,s_4\}_1,\{s_1,s_2,s_3,s_4\}_2,...\}

{{s1​,s2​,s3​,s4​}1​,{s1​,s2​,s3​,s4​}2​,...} ,表示集合中每一种状态

{

s

1

,

s

2

,

s

3

,

s

4

}

i

\{s_1,s_2,s_3,s_4\}_i

{s1​,s2​,s3​,s4​}i​ 都可行。不同的

{

s

1

,

s

2

,

s

3

,

s

4

}

\{s_1,s_2,s_3,s_4\}

{s1​,s2​,s3​,s4​} 一共有

2

4

=

16

2^4=16

24=16 种,不妨就记为二进制数

0000—1111

\text{0000---1111}

0000—1111 ,那我们就可以用

2

16

2^{16}

216 以内的二进制数来表示状态集,第

i

i

i 位上表示

0000—1111

\text{0000---1111}

0000—1111 这 16 种状态的第

i

i

i 种是否可能。(状态

2

4

=

16

2^4=16

24=16 种,状态集

2

2

4

=

2

16

2^{2^4}=2^{16}

224=216 种)

于是我们可以设计一个状态数为

log

T

2

16

\log T*2^{16}

logT∗216 的 DP:

d

p

[

i

]

[

S

]

dp[i][S]

dp[i][S] 表示进行到第

i

i

i 位,状态集

S

S

S. 转移的时候就把状态集

S

S

S 中每一种可能状态进行转移,然后处理出下一位每一种状态是否可行,以便处理出新的状态集

S

0

S'_0

S0′​ 和

S

1

S'_1

S1′​(对应当前位的与值为 0 或 1)。

这应该是做过的单次复杂度最高的数位 DP 了,复杂度为

O

(

log

T

2

16

16

)

O(\log T*2^{16}*16)

O(logT∗216∗16) (按道理复杂度中不应该带常数的)。

CODE

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 100005
#define DB double
#define LL long long
#define ENDL putchar('\n')
#define lowbit(x) (-(x) & (x))
#pragma GCC optimize(2)
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
const int MOD = 998244353;
int n,m,i,j,s,o,k;
LL T,l1,r1,l2,r2;
LL dp[65][1<<16|5];
int cg(int i,int ss,int x,int y) {
int s1 = (ss&1),s2 = ((ss>>1)&1),s3 = ((ss>>2)&1),s4 = ((ss>>3)&1);
int b1 = (s1 ? ((l1>>i)&1):0),t1 = (s2 ? (((r1&T)>>i)&1):((T>>i)&1));
int b2 = (s3 ? ((l2>>i)&1):0),t2 = (s4 ? (((r2&T)>>i)&1):((T>>i)&1));
if(x < b1 || x > t1 || y < b2 || y > t2 || (x|y) != ((T>>i)&1)) return 16;
int res = 0;
if(x == ((l1>>i)&1) && s1) res |= 1;
if(x == ((r1>>i)&1) && s2) res |= (1<<1);
if(y == ((l2>>i)&1) && s3) res |= (1<<2);
if(y == ((r2>>i)&1) && s4) res |= (1<<3);
return res;
}
int main() {
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
T = read();l1 = read();r1 = read();l2 = read();r2 = read();
dp[60][1<<15] = 1;
for(int i = 59;i >= 0;i --) {
for(int S = 0;S < (1<<16);S ++) {
if(!dp[i+1][S]) continue;
int S1 = 0,S0 = 0;
for(int j = 0;j < 16;j ++) {
if(!(S & (1<<j))) continue;
S1 |= (1<<cg(i,j,1,1));
S0 |= (1<<cg(i,j,1,0));
S0 |= (1<<cg(i,j,0,1));
S0 |= (1<<cg(i,j,0,0));
}
S1 &= ((1<<16)-1);
S0 &= ((1<<16)-1);
if(S1) dp[i][S1] += dp[i+1][S];
if(S0) dp[i][S0] += dp[i+1][S];
}
}
LL ans = 0;
for(int i = 1;i < (1<<16);i ++) {
ans += dp[0][i];
}
printf("%lld\n",ans);
return 0;
}

造数字(数位DP)的更多相关文章

  1. xbz分组题B 吉利数字 数位dp入门

    B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...

  2. 牛客小白月赛8 - E - 诡异数字 数位DP

    牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...

  3. SCUT - 289 - 小O的数字 - 数位dp

    https://scut.online/p/289 一个水到飞起的模板数位dp. #include<bits/stdc++.h> using namespace std; typedef ...

  4. HDU 4352 XHXJ's LIS HDU(数位DP)

    HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...

  5. 【BZOJ-1833】count数字计数 数位DP

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  6. BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1833 统计\(a~b\)中数字\(0,1,2,...,9\)分别出现了多少次. 分析 数位dp ...

  7. zznu 1255 数字统计(数位DP, 数学方法)

    最近在学数位DP, 感觉还是满有收获的! 做了几个题之后想起来自己OJ上曾经做的一道题,以前是用数学方法写的,现在改用数位DP来写了一遍. 题目: 1255: 数字统计 时间限制: 1 Sec  内存 ...

  8. BZOJ_1833_[ZJOI2010]count 数字计数_数位DP

    BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...

  9. BZOJ 1833 数字计数 数位DP

    题目链接 做的第一道数位DP题,听说是最基础的模板题,但还是花了好长时间才写出来..... 想深入了解下数位DP的请点这里 先设dp数组dp[i][j][k]表示数位是i,以j开头的数k出现的次数 有 ...

随机推荐

  1. VSCode配置远程免密登陆

    生成秘钥 在本地pc的cmd窗口输入:ssh-keygen -t rsa 生成秘钥 C:\Users\NZY/.ssh/id_rsa.pub 该目录就是生成的秘钥要保存的地方(以我自己的电脑为例) 将 ...

  2. 3.shell脚本循环试题

    shell脚本循环试题 1.计算从1到100所有整数的和 #!/bin/bash a=0 for i in {1..100} #1到100 #每次循环变量i的值也为循环次数 do a=$[ $a + ...

  3. 【图解源码】Zookeeper3.7源码分析,包含服务启动流程源码、网络通信源码、RequestProcessor处理请求源码

    Zookeeper3.7源码剖析 能力目标 能基于Maven导入最新版Zookeeper源码 能说出Zookeeper单机启动流程 理解Zookeeper默认通信中4个线程的作用 掌握Zookeepe ...

  4. kubernetes集群简单实例搭建

    systemctl stop firewalld && systemctl disable firewalldvim /etc/selinux/configSELINUX=disabl ...

  5. 所有人都说Python 简单易学,为何我觉得难?

    来谈谈心 记得刚学Python的时候,几乎所有人都说Python 简单易学,而对于编程零基础,只掌握Word和Excel的人来说,感觉真的好难. 学习之前网上的教材看了,Python的书也看了,包括& ...

  6. Codeforces Round #791 (Div. 2) A-C

    Codeforces Round #791 (Div. 2) A-C A 题目 https://codeforces.com/contest/1679/problem/A 题解 思路 知识点:数学,暴 ...

  7. 详解升讯威在线客服系统前端 JavaScript 脚本加密技术(1)

    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 这段时间有几个技术小伙伴问了我一个有意思的问题:"你的前端脚本是 ...

  8. Java变量和Scanner类

    1.变量的分类1)按数据类型分类   详细说明: 1. 整型:byte(1字节=8bit) \ short(2字节) \ int(4字节) \ long(8字节)   ① byte范围:-128 ~ ...

  9. springboot配置logback.xml

    由于springboot框架自带log4j,因此我们只需配置下logback文件,即可, 在main/resources根目录下,新建logback-spring.xml文件,copy下述代码: &l ...

  10. Mvcapi解决H5请求接口跨域问题

    using Newtonsoft.Json;using System;using System.Collections.Generic;using System.Linq;using System.N ...