积累点:

1: (l&r)+((l^r)>>) == (l+r)/2 
2: 注意判断现在是否有限制。当枚举下一个量时,是(isQuery && j==end),不要搞错。

传送门:http://acm.upc.edu.cn/problem.php?id=2223

题意:

能被7整除或者含7的数称为A-Number,所有A-Number从小到大写好,下标编号(从1开始),去掉那些下标为A-Number的数,剩下的数称为B-Number。求第N个B-Number是多少。

思路:

求A-Number就是简单的数位DP。

dp[i][mod] 表示所有i位数中,%7==mod 的数的个数

dp[i][mod] =  (j != 7)  dp[i-1][(mod-(j*10i-1)%7+7)%7]

(j == 7)  10i-1(nowx%10i-1+1)

(j=0~9(end))

之后 二分答案就行了。[0~B]包含  cal(B) - cal(cal(B))  个B-Number。(B包含的ANumber的数目,就是下标最大。这么大的下标范围内有多少ANumber,减掉,剩下就是BNumber的数量)

二分的时候注意二分到最小的那个。就是说。二分的可能是这样

7 7 7 8 8 8

如果查的是8, 则这时候应该二分到第一个8那个位置。

代码:

#include <cstdio>
#include <cstring> long long dp[][];
int num[];
long long nowx; long long dfs(int i, int mod, bool isQuery) {
if (i == ) {
return mod == ;
}
long long &nowdp = dp[i][mod];
if (!isQuery && ~nowdp) {
return nowdp;
}
int end = isQuery?num[i]:;
long long ans = ;
long long ten = ;
for (int k = ; k < i-; k++) ten *= ; for (int j = ; j <= end; j++) {
if (j == ) {
ans += (isQuery&&j==end)?((nowx%ten)+):ten; // 这一句要小心。
} else {
ans += dfs(i-, (mod-(j*ten)%+)%, isQuery && j == end);
}
}
if (!isQuery) nowdp = ans;
return ans;
} long long cal(long long x) {
nowx = x;
int len = ;
if (x == ) return ;
while (x) {
num[++len] = x%;
x/=;
}
return dfs(len, , true)-; // 减掉0
} long long solve(long long number) {
long long l = ;
long long r = 10e19;
while (l<r) {
long long mid = (l&r)+((l^r)>>);
long long Anum = cal(mid);
long long Bnum = Anum - cal(Anum);
if (Bnum >= number) r = mid;
else l = mid+;
}
return l;
}
int main(){
long long n;
memset(dp, -, sizeof(dp));
while (scanf("%lld", &n) != EOF) {
printf("%lld\n", solve(n));
}
}

UPC 2223: A-Number and B-Number(数位DP+二分)的更多相关文章

  1. poj3208 Apocalypse Someday 数位dp+二分 求第K(K <= 5*107)个有连续3个6的数。

    /** 题目:poj3208 Apocalypse Someday 链接:http://poj.org/problem?id=3208 题意:求第K(K <= 5*107)个有连续3个6的数. ...

  2. CodeChef FAVNUM FavouriteNumbers(AC自动机+数位dp+二分答案)

    All submissions for this problem are available. Chef likes numbers and number theory, we all know th ...

  3. HDU 3943 数位dp+二分

    K-th Nya Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) ...

  4. hihocoder #1301 : 筑地市场 数位dp+二分

    题目链接: http://hihocoder.com/problemset/problem/1301?sid=804672 题解: 二分答案,每次判断用数位dp做. #include<iostr ...

  5. hdu 3709 Balanced Number(平衡数)--数位dp

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  6. C - Balanced Number HDU - 3709 (数位dp)

    题目链接:https://cn.vjudge.net/contest/278036#problem/C 题目大意:手首先是T组数据,然后每一次输入两个数l,r,求这个区间里面满足以某个数字为中心的两侧 ...

  7. hdu 3271 SNIBB 数位DP+二分

    思路:dp[i][j]:表示第i位在B进制下数字和. 用二分找第k个数! 代码如下: #include<iostream> #include<stdio.h> #include ...

  8. HDU 3271 数位dp+二分

    SNIBB Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. [uva 1350]数位dp+二分

    题目链接:https://vjudge.net/problem/38405 #include<bits/stdc++.h> using namespace std; ][]; ]; lon ...

随机推荐

  1. 【思维题 线段树】cf446C. DZY Loves Fibonacci Numbers

    我这种maintain写法好zz.考试时获得了40pts的RE好成绩 In mathematical terms, the sequence Fn of Fibonacci numbers is de ...

  2. 【计数】hdu5921Binary Indexed Tree

    二进制拆位计算贡献 题目描述 树状数组是一种常用的数据结构,下面是树状数组用于给区间 [1,x] 内的数加 t 的代码: void add(int x,int t){ for (int i=x;i;i ...

  3. 安装cfssl证书生成工具

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-am ...

  4. Centos7 install Openstack Juno (RDO) (转载)

    原文地址:http://www.hdume.com/centos-7-0%E5%AE%89%E8%A3%85openstack/ 1.安装系统,Centos7镜像采用CentOS-7.0-1406-x ...

  5. BZOJ 4368: [IOI2015]boxes纪念品盒

    三种路径,左边出去左边回来,右边出去右边回来,绕一圈 绕一圈的路径最多出现一次 那么绕一圈的路径覆盖的点一定是左边半圈的右边和右边半圈的左边 枚举绕一圈的路径的起始点(一定要枚举,这一步不能贪心),更 ...

  6. 剑指offer算法编程题目部分汇总(解法略)

    总结一下本书中遇到的大部分面试题.面试题3:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右的递增顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个整数,判断数 ...

  7. 十分钟了解HTTP协议

    概念 HTTP(Hypertext Transfer Protocol,超文本传输协议)是TCP/IP协议的应用(封装). HTTP协议是单向通讯,无状态,主要应用于B/S模型的网络软件,客户端一(多 ...

  8. LRESULT CALLBACK WndProc 窗口程序的 重点

    LRESULT CALLBACK WndProc Windows程序所作的一切,都是回应发送给窗口消息处理程序的消息.这是概念上的主要难点之一,在开始写作Windows程序之前,必须先搞清楚. 窗口消 ...

  9. python学习-- 默认urls中 Path converter

    默认Path converter Django2.0自带的PathConveter包括: str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器. int:匹配0及 ...

  10. EM算法简易推导

    EM算法推导 网上和书上有关于EM算法的推导,都比较复杂,不便于记忆,这里给出一个更加简短的推导,用于备忘. 在不包含隐变量的情况下,我们求最大似然的时候只需要进行求导使导函数等于0,求出参数即可.但 ...