题意求 &lt; = x &lt;=x <=x最大的 n n n,满足 1 − n 中 的 所 有 数 的 数 位 中 数 d 1-n中的所有数的数位中数d 1−n中的所有数的数位中数d出现了n次
从网上找了个板子,是求 1 − n 1-n 1−n中 d d d出现的次数,这里叫它 c o u n t ( n , d ) count(n,d) count(n,d) 复杂度 l o g n logn logn
因为我们要找 &lt; = x &lt;=x <=x最大的 n n n

我们先算一下 c o u n t ( x , d ) count(x,d) count(x,d)
如果 c o u n t ( x , d ) = = x count(x,d)==x count(x,d)==x
自然x就是我们想要的结果

如果 c o u n t ( x , d ) &lt; x count(x,d)&lt;x count(x,d)<x
我们就可以直接把 x x x赋值成 c o u n t ( x , d ) count(x,d) count(x,d)
因为他们之间的数肯定是大于我们想要的结果的

如果 c o u n t ( x , d ) &gt; x count(x,d)&gt;x count(x,d)>x
我们假设x是一个 m m m位数,并且他的所有位数都是 d d d
在这样的情况下我们只需要重新让 x = x − ( c o u n t ( x , d ) − x ) / m x=x-(count(x,d)-x)/m x=x−(count(x,d)−x)/m即可
因为在最坏的情况下所有的位数都是 d d d
我们要想让 c o u n t ( x , d ) 和 x 相 等 count(x,d)和x相等 count(x,d)和x相等至少要它减去 ( c o u n t ( x , d ) − x ) / m (count(x,d)-x)/m (count(x,d)−x)/m个数

举个例子嘛,我们想计算小于9999999的,假设现在count(9999999,9)=88888888,我们肯定不能一个一个减,一个一个找,很明显右边的88888888远大于9999999,,我们计算9999999和88888888的差值,9999999是一个7位数,count(9999999,9)=88888888,左边减去1,对于右边的损耗最大就是7(每一位1个),让上面的差值除以这个7,就是最小的左边要减去的数量,通过这种方法,来达到减少枚举次数的目的。
应该大概可能是没啥毛病吧

#include<bits/stdc++.h>using namespace std;
typedef long long ll;
ll count(ll n,ll x)
{ll cnt=0,k;for(ll i=1;k=n/i;i*=10){cnt+=(k/10)*i;ll cur=k%10;if(cur>x){cnt+=i;}else if(cur==x){cnt+=n-k*i+1;}}return cnt;
}
int num(ll n)
{int ans=0;while(n){ans++;n/=10;}return ans;
}
int main()
{ll n;int t;scanf("%d",&t);ll d;ll x;while(t--){scanf("%lld%lld",&d,&n);while(1){x=count(n,d);if(x==n){printf("%lld\n",x);break;}else if(x<n){n=x;}else{n=n-max((x-n)/num(x),1LL);}}}return 0;
}

HDU 6659 Acesrc and Good Numbers相关推荐

  1. HDU 5676 ztr loves lucky numbers

    -亚信科技,巴卡斯(杭州),壹晨仟阳(杭州),英雄互娱(杭州)  (包括2016级新生)除了校赛,还有什么途径可以申请加入ACM校队?  ztr loves lucky numbers Time Li ...

  2. HDU 5756 ztr loves lucky numbers (dfs)(搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 题目大意:只有7和4且7和4数量相等的数字为幸运数字,给你数字n,你要找出大于等于n的最小的幸运 ...

  3. hdu 5505(GT and numbers)

    题意: 给你a和b,a每次和它的因子相乘得到一个新的a,求多少次后可以得到b. 输入样例 3 1 1 1 2 2 4 输出样例 0 -1 1 思路: 每次找出a和b/a的最大公约数(即当前a想得到b能 ...

  4. HDU - 6661 Acesrc and String Theory (后缀数组)

    题目链接 题意 求字符串SSS中满足子串可以复制KKK次得到的字串的数量,不位置字串相同的字符串分开计算 思路 看题解补完的这道题 枚举循环节的长度XXX,从头找到字符串SSS中连续出现循环节的最多的 ...

  5. 2019HDU多校补题

    心得:做不出,补不动 HUD第一场: 1001 Blank Y 1002 Operation Y 1003 Milk 1004 Vication Y 1005 Path Y 1006 Typewrit ...

  6. 基础算法 —— 模拟思维

    [概述] 模拟,是根据实际问题建立模型,模拟实际按程序走一遍,最终求出答案. 思维,则是与逻辑思维有关,其需要针对题意.数据范围等抽丝剥茧抽离出有用的信息,从而得出一个结果. 对于一般的模拟,直接根据 ...

  7. 解题报告 (十四) 数位DP

    文章目录 数位DP 解题报告 HDU 4722 Good Numbers HDU 2089 不要62 HDU 3555 Bomb HDU 3652 B-number PKU 3252 Round Nu ...

  8. HDU 1492 The number of divisors(约数) about Humble Numbers(数论,简单约数)

    The number of divisors(约数) about Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  9. hdu 6168 Numbers

    zk has n numbers a1,a2,...,an. For each (i,j) satisfying 1≤i<j≤n, zk generates a new number (ai+a ...

最新文章

  1. 继承项目第13周-项目1-基类中成员的访问限定符和派生类的继承方式
  2. 面试题:接口和抽象类的区别
  3. Linux如何在系统启动时自动加载模块
  4. Spring远程调用技术1-RMI
  5. 两个列向量相乘怎么计算_机器学习 线性代数基础 | 1.4 矩阵乘向量的新视角:变换基底...
  6. 使用GDB命令行调试器调试C/C++程序
  7. CVS的使用教程(转)
  8. Flask爱家租房--celery(发送验证短信)
  9. 傳統經理人的迷思(转)
  10. Tomcat日志文件位置
  11. Flink + TiDB,体验实时数仓之美
  12. SharePoint 2007中的搜索服务
  13. 可以在电脑上在线录制视频GIF的软件,不需要下载安装
  14. Unity Shader - ShaderLab: Pass Tags Pass的Tags标签
  15. Unity ToLua 使用教程
  16. 8080端口被占用如何杀掉进程
  17. lvds输入悬空_lvds接口定义
  18. 猜字游戏加关机,你也可以整你的小伙伴哦。
  19. [聊天机器人]:开源ChatterBot工作原理
  20. c语言 11 getchar实现大小写字母转换

热门文章

  1. 阿特拉斯耸耸肩:安兰德献给人类的启蒙教育
  2. [内网基础]msf使用内网实战演示
  3. Makefile 中的subst
  4. RPG游戏-好友系统
  5. Ubuntu 18.04 使用 Autokey 给 联想台式电脑 关闭fn
  6. python turtle虎年来拜年了
  7. 做网络推广不能只固守一个平台,需要多元化!
  8. Ubuntu Linux操作系统tftp服务器和客户端安装(简单操作)
  9. ASMCMD执行ASM元数据备份与还原
  10. Unity3D消除类游戏《永恒之花》截图