CodeForces 215E Periodical Numbers 数位DP
题意:给你一个区间[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相关推荐
- CodeForces 215E Periodical Numbers 数位DP
这题做了有好几天了,终于过了= = 完全不懂网上题解的递推写法,只能自己用记忆化搜索瞎搞,总算是搞出来了. 具体策略就是记忆化搜索的时候用一个tmp数组记录最前面len个的值,然后后面的数字必须要和前 ...
- CodeForces - 628D Magic Numbers(数位dp)
题目链接:点击查看 题目大意:首先规定一个不含前导零的数字如果满足: 从最高位开始,偶数位置全为 ddd 从最高位开始,奇数位置不能出现 ddd 则称该数字为 d−magicd-magicd−magi ...
- Codeforces 55D Beautiful numbers (数位DP)
题意:有T组询问,每次询问区间[l, r]中的beautiful number有多少.beautiful number是指这个数可以被组成它的数字整除.例如15是beautiful number,因为 ...
- codeforces 628D. Magic Numbers 数位dp
题目链接 给两个数m, d. 两个数a, b. a, b长度小于2000, 长度相等.求在a, b之间的数x, x%m==0, 并且从高位往低位数, 奇数位的数全部不等于d, 偶数为的数全都等于d, ...
- Codeforces 215E Periodical Numbers 容斥原理
Periodical Numbers 我们先按长度分类对于当前处理的长度k, 我们令 F[ i ] 为有长度为 i 的循环节的方案数. 然后容斥出f[ i ] 表示最小循环节是 i 的方案数, 然后加 ...
- Educational Codeforces Round 8 D. Magic Numbers 数位DP
D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...
- SPOJ - BALNUM Balanced Numbers(数位dp+进制转换)
题目链接:点击查看 题目大意:给出平衡数的定义:每一个偶数出现的次数必须是奇数次,每一个奇数出现的次数必须是偶数次,求给定区间中有多少个平衡数 题目分析:数位dp,这个题目就难在怎么确定状态转移,本来 ...
- POJ - 3252 Round Numbers(数位dp)
题目链接:点击查看 题目大意:规定一个数如果二进制中0的个数大于等于1的个数,则这个数称为"整数",问闭区间a,b中有多少个整数 题目分析:数位dp,dp[pos][c0][c1] ...
- Codeforces Beta Round #51 D. Beautiful numbers 数位dp + 状态优化
传送门 文章目录 题意: 思路: 题意: 思路: 数位dpdpdp挺经典的一个题辣,有一个很明显的状态就是f[pos][num][lcm]f[pos][num][lcm]f[pos][num][lcm ...
最新文章
- 初探Django2.1:Win10+Python3.6.6环境下安装Django
- Android源码之Camera系统架构
- 在vi里面实现字符串的批量替换
- 2014\Province_C_C++_B\2 切面条
- 余额宝放10万元,一年收益大概有多少钱?
- 大数据 notebook_Dockerless Notebook:数据科学期待已久的未来
- python同时注释多行代码_python怎么同时对多行代码进行注释
- 文件服务器+快照恢复,云服务器快照恢复
- 【JavaScript】我所知道的JavaScript
- 制造-销售”模式正在消亡,传统大型企业的上云之路要如何举步?
- Dawn 阿里开源前端开发构建工具
- SQLServer2016安装教程
- PMP考试-风险管理专项突破(第六版)
- 数据有效性 动态选择
- 180822 逆向-网鼎杯(2-1)
- 有哪些免费的CRM软件可以使用?
- Spring AOP报错Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available问题
- Android-布局 协调CoorinatorLayout
- iview构建基本html页面,写前端页面步骤----vue+iview
- 小红书笔记api_odoo与小红书对接笔记
热门文章
- 05、Vue-页面骨架《饿了吗》
- Golang实现Kafka消息发送、接收
- TMS320F28xx SPI master/slave example
- Java getParentFile().mkdirs()用法
- What is new in Android security (M and N Version) - Google I/O 2016 翻译
- 欧姆龙转MQTT边缘计算网关(产品)
- 常吃香蕉有效防治12种病
- 如何将一张Excel表中的数据匹配到另一张表里
- item_search_shop-获得店铺所有的商品(shopee虾皮)
- db2无法启动纠错过程