传送门

题意:给出$N$个范围在$[0,2^k-1]$的整数,定义位运算$NAND$为位运算$AND$的逆运算,求$[L,R]$中有多少数能成为若干个前面给出的整数、若干括号和$NAND$运算组成的表达式的结果(每一个数在一个表达式中可以出现多次)。


OI生涯第一道数位DP

可以使用$NAND$表示所有基本位运算(这个可以手玩出来qwq),那么$NAND$像基本位运算一样会有一个性质:如果所有给出的整数中第$i$位和第$j$位相同,那么最后的结果的第$i$位与第$j$位也一定相同,而不满足这个条件的位在一个确定了之后,另一位仍然可以同时取$0$或$1$(基于线性基的思想可以证明这个结论),那么我们可以预处理出所有互相影响的位,然后数位$DP$即可。

数位$DP$留在以后的专题??反正现在不想写,实在不懂看下面的code吧

 #include<bits/stdc++.h>
 #define ll long long
 //This code is written by Itst
 using namespace std;

 inline ll read(){
     ll a = ;
     ;
     char c = getchar();
     while(c != EOF && !isdigit(c)){
         if(c == '-')
             f = ;
         c = getchar();
     }
     while(c != EOF && isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return f ? -a : a;
 }

 ;
 ll num[MAXN] , K , N , p[];
 bool vis[MAXN];
 vector < ];

 inline ll poww(ll a , int b){
     ll times = ;
     while(b){
         )
             times = times * a;
         a = a * a;
         b >>= ;
     }
     return times;
 }

 ll dfs(int now , ll sum , ll limit){
      || !p[now])
         ;
     if(vis[now])
          , sum , limit);
     ll s = sum;
      ; i < influ[now].size() ; i++)
         s |= 1ll << influ[now][i];
     if(s <= limit)
          , s , limit) + poww( , p[now] - );
     else
          , sum , limit);
 }

 int main(){
 #ifdef LG
     freopen("3220.in" , "r" , stdin);
     //freopen("3220.out" , "w" , stdout);
 #endif
     N = read();
     K = read();
     ll L = read() , R = read();
      ; i <= N ; i++)
         num[i] = read();
      ; i >=  ; i--){
         if(vis[i])
             continue;
         influ[i].push_back(i);
          ; j >=  ; j--){
             if(vis[j])
                 continue;
             ;
              ; f && k <= N ; k++)
                 f = ((num[k] >> i) & ) == ((num[k] >> j) & );
             if(f){
                 vis[j] = ;
                 influ[i].push_back(j);
             }
         }
     }
      ; i < K ; i++)
         p[i] = (i ? p[i - ] : ) + !vis[i];
     printf( ,  , R) - (L ? dfs(K -  ,  , L - ) : ));
     ;
 }

Luogu3220 HNOI2012 与非 数位DP的更多相关文章

  1. 数字统计类题目的非数位DP解法

    ZJOI2010 数字统计 上题题意为求[l,r]区间中每个数字(0~9)出现的次数 一般的做法为将区间当成[0,r]-[0,l-1],然后进行数位DP 但事实上将区间当成[0,r]-[0,l-1]后 ...

  2. 【BZOJ2728】[HNOI2012]与非 并查集+数位DP

    [BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述.  ...

  3. BZOJ2728 HNOI2012与非(并查集+数位dp)

    容易发现x nand x=not x.并且使用这个性质有x and y=not(x nand y)=(x nand y)nand(x nand y).也就是说nand运算可以作为not和and运算使用 ...

  4. BNUOJ 52325 Increasing or Decreasing 数位dp

    传送门:BNUOJ 52325 Increasing or Decreasing题意:求[l,r]非递增和非递减序列的个数思路:数位dp,dp[pos][pre][status] pos:处理到第几位 ...

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

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

  6. codeforces 55D - Beautiful numbers(数位DP+离散化)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  7. HDU 3652 B-number(数位dp)

    题意:B数的定义是有字符串“13”且能被整数13整除的数,求[1,n]内的B数个数. 题解:这是数位DP,我也就是刚入门,前两天看到了非递归写法,好麻烦.所以我建议写dfs的方法,容易理解,代码还简短 ...

  8. [kuangbin带你飞]专题十五 数位DP

            ID Origin Title   62 / 175 Problem A CodeForces 55D Beautiful numbers   30 / 84 Problem B HD ...

  9. 数位DP专题

    这周开始刷数位DP,在网上找到一份神级数位DP模板,做起题目来爽歪歪. http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html in ...

随机推荐

  1. Javascript异步编程之三Promise: 像堆积木一样组织你的异步流程

    这篇有点长,不过干货挺多,既分析promise的原理,也包含一些最佳实践,亮点在最后:) 还记得上一节讲回调函数的时候,第一件事就提到了异步函数不能用return返回值,其原因就是在return语句执 ...

  2. Landsat8 卫星数据下载

    具体参考    https://www.ixxin.cn/2016/11/27/landsat8freedata/

  3. 性能测试 Apache参数配置与性能调优

    Apache性能调优 by:授客 QQ:1033553122 环境: Apache 2.4 1.选择合适的MPM(Multi -Processing Modules, 多处理模块) Unix/Linu ...

  4. Android开发专业名词及工具概述

    前言: 系统的学习下Android开发中涉及到的一些专业名词 和Android开发工具 名词: 一.SDK(Software Development Kit) 软件开发工具包:一般都是一些软件工程师为 ...

  5. Angular基础(四) 创建Angular应用

    应用(Application)是由组件构成的树.树的根部是最顶层的组件即应用本身,启动的时候,浏览器会最先渲染顶层组件,然后根据树形结构,迭代渲染子组件.组件是可装配的,可以互相组合以构成更大的组件. ...

  6. Expo大作战(三十六)--expo sdk api之 ImagePicker,ImageManipulator,Camera

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  7. 如何修改redis配置

    相关内容: Redis的配置: 通过config set命令修改配置 查看配置 设置新配置 直接修改配置文件redis.conf 常见配置项: 服务端连接相关 日志记录相关 服务端保持相关 首发时间: ...

  8. php中编码转换方法

    php里经常用到编码转换,在这记录一个常用的编码转换方法,字符串.数组.对象都可以使用,使用了递归来解决,比较普通 /* * php中编码转换 * @param $param 需要转换的数据 * @p ...

  9. 3.8Python数据处理篇之Numpy系列(八)---Numpy的梯度函数

    目录 目录 前言 (一)函数说明 (二)一维数组的应用 (三)多维数组的应用 目录 前言 梯度函数,其中的梯度也就是斜率,反映的是各个数据的变化率.在numpy中只有一个梯度函数. (一)函数说明 ( ...

  10. 使用sstream来进行类型转换

    在某种情况下,我们不得不进行整型等数据类型与字符串类型的转换,比如,将“1234”转换为整数,常规的我们可以使用atoi函数来进行转换,或者是写一个循环来做转换,我们在这里也可以使用sstream类来 ...