积累点:

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));
}
}

最新文章

  1. JVM之ParNew收集器
  2. JVM-字节码指令
  3. Objective-c——UI基础开发第七天(自定义UITableView)
  4. WP开发笔记——去除 HTML 标签
  5. 【Linux安全】防止 root 用户远程登录
  6. c程序设计语言_习题8-6_利用malloc()函数,重新实现c语言的库函数calloc()
  7. 怎样从官网下载Spring的jar包
  8. android 休眠唤醒机制分析(三) — suspend
  9. ISO C Random Number Functions
  10. Yaha,Yaho
  11. C#之关于时间的整理
  12. Java虚拟机参数设置(转)
  13. 006开源O/R映射框架内容回顾
  14. CY7C68013A控制传输
  15. java 学习(二)
  16. HDU_1257
  17. 【问题汇总】ScrollView嵌套GridView的问题
  18. _proto_理解
  19. jquery.$.ajax简单的使用
  20. 使用JAVA数组实现顺序表

热门文章

  1. 【kmp】bzoj3620: 似乎在梦中见过的样子
  2. Python数据分析【炼数成金15周完整课程】
  3. java的一些相关介绍(2013-10-07-163 写的日志迁移
  4. 进入JVM的世界:《深入理解JVM虚拟机》-- 思维导图
  5. stm32独立看门狗实验
  6. poj 1742 多重背包问题 dp算法
  7. NO_PUBKEY
  8. HDU 5238 Calculator 线段树 中国剩余定理
  9. Java学习笔记3---unable to launch
  10. Just a test