题意:给你一个区间[l,r],求这个区间内满足条件的数,条件是:这个数的二进制表示时,dig[i] == dig[i+k],(0<k<len,且len%k==0,len为这个数的二进制代码长度)

思路:考虑[0,x]这个区间,若x的位数为len,当数的长度 i 为0~len-1时,则是无限制的,这时dp[i] = sum{2^(k-1)},k为满足条件的循环长度。而且还要去掉重复的,比如当长度为6时,循环长度为2,3的数均会重复计算,当数的长度为len时,则在限制下,计算满足条件的数,具体实现看代码注释:

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef __int64 int64;
typedef long long ll;
#define M 600005
#define N 1000005
#define max_inf 0x7f7f7f7f
#define min_inf 0x80808080
#define mod 1000000007
#define lc rt<<1
#define rc rt<<1|1ll dp[70] , r , l , table[70];//table[i] = 2^i;
int dig[70];ll Cal(int k)//计算长度为k的数,满足条件的个数
{int i , j;ll ret = 0;for (i = 1 ; i < k ; i++){if (k%i)continue;dp[i] = table[i-1];for (j = 1 ; j < i ; j++)//减掉重复计算的数{if (i%j == 0)dp[i] -= dp[j];}ret += dp[i];}return ret;
}ll Solve(ll k)
{int i , j , len = 0;ll ret = 0 , temp = k , num;while (temp){dig[++len] = temp&1;temp >>= 1;}//计算无限制时满足条件的数for (i = 1 ; i < len ; i++)ret += Cal(i);for (i = 1 ; i < len ; i++)//长度为len时,枚举循环长度{if (len%i)continue;num = 1;temp = 0;dp[i] = 0;for (j = len-1 ; j > len-i ; j--){//若dig[j]==1则可以令dig[j]=0,转变成无限制的情况if (dig[j])dp[i] += table[i-(len-j)-1];num = num*2+dig[j];}temp = num;int up = len/i;for (j = 1 ; j < up ; j++)num = (num<<i)+temp;//num保存的为循环长度为i,且循环内每一位都受限制的情况下的这个数dp[i] += (num <= k);//若num比k小,则加入答案中//去掉重复的计算的数for (j = 1 ; j < i ; j++){if (i%j == 0)dp[i] -= dp[j];}ret += dp[i];}return ret;
}int main()
{int i;for (table[0] = 1 , i = 1 ; i < 70 ; i++)table[i] = table[i-1]*2;while (~scanf("%I64d%I64d",&l,&r))printf("%I64d\n",Solve(r)-Solve(l-1));return 0;
}

CodeForces 215E Periodical Numbers 数位DP相关推荐

  1. CodeForces 215E Periodical Numbers 数位DP

    这题做了有好几天了,终于过了= = 完全不懂网上题解的递推写法,只能自己用记忆化搜索瞎搞,总算是搞出来了. 具体策略就是记忆化搜索的时候用一个tmp数组记录最前面len个的值,然后后面的数字必须要和前 ...

  2. CodeForces - 628D Magic Numbers(数位dp)

    题目链接:点击查看 题目大意:首先规定一个不含前导零的数字如果满足: 从最高位开始,偶数位置全为 ddd 从最高位开始,奇数位置不能出现 ddd 则称该数字为 d−magicd-magicd−magi ...

  3. Codeforces 55D Beautiful numbers (数位DP)

    题意:有T组询问,每次询问区间[l, r]中的beautiful number有多少.beautiful number是指这个数可以被组成它的数字整除.例如15是beautiful number,因为 ...

  4. codeforces 628D. Magic Numbers 数位dp

    题目链接 给两个数m, d. 两个数a, b. a, b长度小于2000, 长度相等.求在a, b之间的数x, x%m==0, 并且从高位往低位数, 奇数位的数全部不等于d, 偶数为的数全都等于d, ...

  5. Codeforces 215E Periodical Numbers 容斥原理

    Periodical Numbers 我们先按长度分类对于当前处理的长度k, 我们令 F[ i ] 为有长度为 i 的循环节的方案数. 然后容斥出f[ i ] 表示最小循环节是 i 的方案数, 然后加 ...

  6. Educational Codeforces Round 8 D. Magic Numbers 数位DP

    D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...

  7. SPOJ - BALNUM Balanced Numbers(数位dp+进制转换)

    题目链接:点击查看 题目大意:给出平衡数的定义:每一个偶数出现的次数必须是奇数次,每一个奇数出现的次数必须是偶数次,求给定区间中有多少个平衡数 题目分析:数位dp,这个题目就难在怎么确定状态转移,本来 ...

  8. POJ - 3252 Round Numbers(数位dp)

    题目链接:点击查看 题目大意:规定一个数如果二进制中0的个数大于等于1的个数,则这个数称为"整数",问闭区间a,b中有多少个整数 题目分析:数位dp,dp[pos][c0][c1] ...

  9. Codeforces Beta Round #51 D. Beautiful numbers 数位dp + 状态优化

    传送门 文章目录 题意: 思路: 题意: 思路: 数位dpdpdp挺经典的一个题辣,有一个很明显的状态就是f[pos][num][lcm]f[pos][num][lcm]f[pos][num][lcm ...

最新文章

  1. 初探Django2.1:Win10+Python3.6.6环境下安装Django
  2. Android源码之Camera系统架构
  3. 在vi里面实现字符串的批量替换
  4. 2014\Province_C_C++_B\2 切面条
  5. 余额宝放10万元,一年收益大概有多少钱?
  6. 大数据 notebook_Dockerless Notebook:数据科学期待已久的未来
  7. python同时注释多行代码_python怎么同时对多行代码进行注释
  8. 文件服务器+快照恢复,云服务器快照恢复
  9. 【JavaScript】我所知道的JavaScript
  10. 制造-销售”模式正在消亡,传统大型企业的上云之路要如何举步?
  11. Dawn 阿里开源前端开发构建工具
  12. SQLServer2016安装教程
  13. PMP考试-风险管理专项突破(第六版)
  14. 数据有效性 动态选择
  15. 180822 逆向-网鼎杯(2-1)
  16. 有哪些免费的CRM软件可以使用?
  17. Spring AOP报错Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available问题
  18. Android-布局 协调CoorinatorLayout
  19. iview构建基本html页面,写前端页面步骤----vue+iview
  20. 小红书笔记api_odoo与小红书对接笔记

热门文章

  1. 05、Vue-页面骨架《饿了吗》
  2. Golang实现Kafka消息发送、接收
  3. TMS320F28xx SPI master/slave example
  4. Java getParentFile().mkdirs()用法
  5. What is new in Android security (M and N Version) - Google I/O 2016 翻译
  6. 欧姆龙转MQTT边缘计算网关(产品)
  7. 常吃香蕉有效防治12种病
  8. 如何将一张Excel表中的数据匹配到另一张表里
  9. item_search_shop-获得店铺所有的商品(shopee虾皮)
  10. db2无法启动纠错过程