HDU 6659 Acesrc and Good Numbers
题意求 < = x <=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
因为我们要找 < = x <=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 ) < x count(x,d)<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 ) > x count(x,d)>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相关推荐
- HDU 5676 ztr loves lucky numbers
-亚信科技,巴卡斯(杭州),壹晨仟阳(杭州),英雄互娱(杭州) (包括2016级新生)除了校赛,还有什么途径可以申请加入ACM校队? ztr loves lucky numbers Time Li ...
- HDU 5756 ztr loves lucky numbers (dfs)(搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 题目大意:只有7和4且7和4数量相等的数字为幸运数字,给你数字n,你要找出大于等于n的最小的幸运 ...
- 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能 ...
- HDU - 6661 Acesrc and String Theory (后缀数组)
题目链接 题意 求字符串SSS中满足子串可以复制KKK次得到的字串的数量,不位置字串相同的字符串分开计算 思路 看题解补完的这道题 枚举循环节的长度XXX,从头找到字符串SSS中连续出现循环节的最多的 ...
- 2019HDU多校补题
心得:做不出,补不动 HUD第一场: 1001 Blank Y 1002 Operation Y 1003 Milk 1004 Vication Y 1005 Path Y 1006 Typewrit ...
- 基础算法 —— 模拟思维
[概述] 模拟,是根据实际问题建立模型,模拟实际按程序走一遍,最终求出答案. 思维,则是与逻辑思维有关,其需要针对题意.数据范围等抽丝剥茧抽离出有用的信息,从而得出一个结果. 对于一般的模拟,直接根据 ...
- 解题报告 (十四) 数位DP
文章目录 数位DP 解题报告 HDU 4722 Good Numbers HDU 2089 不要62 HDU 3555 Bomb HDU 3652 B-number PKU 3252 Round Nu ...
- 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 ...
- 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 ...
最新文章
- 继承项目第13周-项目1-基类中成员的访问限定符和派生类的继承方式
- 面试题:接口和抽象类的区别
- Linux如何在系统启动时自动加载模块
- Spring远程调用技术1-RMI
- 两个列向量相乘怎么计算_机器学习 线性代数基础 | 1.4 矩阵乘向量的新视角:变换基底...
- 使用GDB命令行调试器调试C/C++程序
- CVS的使用教程(转)
- Flask爱家租房--celery(发送验证短信)
- 傳統經理人的迷思(转)
- Tomcat日志文件位置
- Flink + TiDB,体验实时数仓之美
- SharePoint 2007中的搜索服务
- 可以在电脑上在线录制视频GIF的软件,不需要下载安装
- Unity Shader - ShaderLab: Pass Tags Pass的Tags标签
- Unity ToLua 使用教程
- 8080端口被占用如何杀掉进程
- lvds输入悬空_lvds接口定义
- 猜字游戏加关机,你也可以整你的小伙伴哦。
- [聊天机器人]:开源ChatterBot工作原理
- c语言 11 getchar实现大小写字母转换