【xsy1143】 兔子的数字 搜索
题目大意:请找到第$k$大的数,满足各位数字之和等于各位数字之积。其中$k≤10^{18}$。
首先我们要确定这个第$k$大的数有多大
我们用$f[i][j][he][ji]$表示我们要搜索一个$i$位的数字,还有$j$位没有确定,且确定的位总和为$i$,积为$j$的方案数。
我们发现:若$he+j<ji$,则$f[i][j][he][ji]=0$(假设后面大量地补$1$,即只增加各位数字之和而不增加各位数字之积,如果积过大,那么显然这种方法并不奏效)
若$he+j=ji$,则$f[i][j][he][ji]=\binom{i}{j}$(这种情况下,余下的j位均为$1$恰好可以让和等于积,组合数的意义为将$j$个$1$插入到已经确定的i-j位数中)
若$j=0$,那么显然只需要判一下和是否等于积即可。
若在这三种情况外,直接枚举下一位数字($2$到$9$枚举)。
我们设第$k$大的数字位数为$x$,每次计算$f[x][x][0][1]$,若$f[x][x][0][1]<n$,则$n-=f[x][x][0][1]$,并且$x++$,否则这个$x$即为第$k$大数的位数。
接着从大到小枚举每一位,随后计算当该数前若干位确定时的方案数,借此逐位确定整个数
时间复杂度为$O(??)$
#include<bits/stdc++.h>
#define L long long
#define M 505
using namespace std;
L n,c[M][M]={}; L calc(int n,int m,int he,int ji){
if(he+m<ji) return ;
if(!m) return he==ji;
if(he+m==ji&&ji!=)
return c[n][m];
L cnt=;
for(int i=;i<;i++)
cnt+=calc(n,m-,he+i,ji*i);
return cnt;
} int main(){
cin>>n;
for(int i=;i<M;i++){
c[i][]=;
for(int j=;j<=i;j++)
c[i][j]=c[i-][j]+c[i-][j-];
}
if(n<){printf("%d\n",n); return ;}
n--;
int hh=;
while(){
L now=calc(hh,hh,,);
if(now<n) n-=now,hh++;
else break;
}
int he=,ji=;
for(int i=hh;i;i--){
for(int j=;j<;j++){
L now=calc(i-,i-,he+j,ji*j);
if(now<n)n-=now;
else{
printf("%d",j);
he+=j; ji*=j;
break;
}
}
}
}
【xsy1143】 兔子的数字 搜索的更多相关文章
- 十分钟搞懂Elasticsearch数字搜索原理
更多精彩内容请看我的个人博客或者扫描二维码,关注微信公众号:佛西先森 前言 Elasticsearch诞生的本意是为了解决文本搜索太慢的问题,ES会默认将所有的输入内容当作字符串来理解,对于字段类型是 ...
- vue2 前端搜索实现
项目数据少的时候,搜索这样的小事情就要交给咱们前端来做了,重要声明,适用于小项目!!!!! 其实原理很简单,小demo是做搜索市区名称或者按照排名搜索. <div> <input t ...
- 空间搜索(圆范围)中Geohash编码方案和网格编码方案对比探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 多个项目中实现范围(圆)搜索的方案为:依赖库表中的X和Y字段构 ...
- 剑指Offer(二十八):数组中出现次数超过一半的数字
剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- LeetCode初级算法--数组01:只出现一次的数字
LeetCode初级算法--数组01:只出现一次的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- 如何有效的使用google进行搜索的20个技能
每天有数百万人因为各种各样的原因使用谷歌搜索.学生们把它用于学校,商人们把它用于研究,还有数百万人把它用于娱乐.但大多数人可能没有充分利用谷歌搜索的潜力. 想要更有效地使用谷歌搜索,并得到您想要的搜索 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- LDAP注入与防御解析
[目录] 0x1 LDAP介绍 0x2 LDAP注入攻击及防御 0x3 参考资料 0x1 LDAP介绍 1 LDAP出现的背景 LDAP(Lightweight Directory Access Pr ...
- Lucene的Query类介绍
把Lucene的查询当成sql的查询,也许会笼统的明白些query的真相了. 查询分为大致两类,1:精准查询.2,模糊查询. 创建测试数据. private Directory directory; ...
随机推荐
- jquery报.live() is not a function的解决方法
jquery报.live() is not a function的解决方法: jquery中的live()方法在jquery1.9及以上的版本中已被废弃了,如果使用,会抛出TypeError: $(. ...
- 2018.10.09 NOIP模拟 好数(双向搜索)
传送门 直接双向搜索出两边可行解,然后把两边的可行解合并起来得出答案就行了. 注意合并的时候可以利用排序和单调性优化时间复杂度. 直接枚举合并是O(siza∗sizb)O(siza*sizb)O(si ...
- LA 3026 && POJ 1961 Period (KMP算法)
题意:给定一个长度为n字符串s,求它每个前缀的最短循环节.也就是对于每个i(2<=i<=n),求一个最大整数k>1(如果存在),使得s的前i个字符组成的前缀是某个字符串重复得k次得到 ...
- php PDO mysql
php PDO写法连接mysql: $db=new PDO("mysql:host=localhost;dbname=sql","root","roo ...
- MATLAB实现截位的问题
讨论MATLAB怎样提取10进制中的位的方法,因为做FFT时要用到截位,相去验证它,向同庆请教, 原来只是除以2的N次方,取模取余就行了,可恨我还想了一下午,也没有一个好办法. 接下来的问题是,对于负 ...
- 201709012工作日记--一台电脑创建两个Github账户上传代码
1. 在一台主机上面使用多个GitHub账号 有时候,我们需要将个人账号和公司账号区分,这时候我们就会需要在一台电脑上使用2个不同的git账号. 2. 上传文件 http://blog.csdn.ne ...
- (转) MVC 中 @help 用法
ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项(除了继续支持/加强现有的.aspx视图引擎外).当编写一个视图模板时,Razor将所需的字符和击键数减少到最小,并保证一个快速.通 ...
- c# 点击按选择图片然后展示在richTextBox中
OpenFileDialog o = new OpenFileDialog(); o.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory; ...
- 建立多人协作git仓库/git 仓库权限控制(SSH)
转载文章请保留出处 http://blog.csdn.net/defeattroy/article/details/13775499 git仓库是多人协作使用的,可以基于很多种协议,例如http.g ...
- [A,D]=solverAdini(node,elem,bdEdge,h1,h2)
>> [A,D]=solverAdini(node,elem,bdEdge,h1,h2) A = (1,1) 14.5000 (2,1) 11.0000 (3,1) 11.5000 (4, ...