题目大意:请找到第$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】 兔子的数字 搜索的更多相关文章

  1. 十分钟搞懂Elasticsearch数字搜索原理

    更多精彩内容请看我的个人博客或者扫描二维码,关注微信公众号:佛西先森 前言 Elasticsearch诞生的本意是为了解决文本搜索太慢的问题,ES会默认将所有的输入内容当作字符串来理解,对于字段类型是 ...

  2. vue2 前端搜索实现

    项目数据少的时候,搜索这样的小事情就要交给咱们前端来做了,重要声明,适用于小项目!!!!! 其实原理很简单,小demo是做搜索市区名称或者按照排名搜索. <div> <input t ...

  3. 空间搜索(圆范围)中Geohash编码方案和网格编码方案对比探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 多个项目中实现范围(圆)搜索的方案为:依赖库表中的X和Y字段构 ...

  4. 剑指Offer(二十八):数组中出现次数超过一半的数字

    剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  5. LeetCode初级算法--数组01:只出现一次的数字

    LeetCode初级算法--数组01:只出现一次的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  6. 如何有效的使用google进行搜索的20个技能

    每天有数百万人因为各种各样的原因使用谷歌搜索.学生们把它用于学校,商人们把它用于研究,还有数百万人把它用于娱乐.但大多数人可能没有充分利用谷歌搜索的潜力. 想要更有效地使用谷歌搜索,并得到您想要的搜索 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. LDAP注入与防御解析

    [目录] 0x1 LDAP介绍 0x2 LDAP注入攻击及防御 0x3 参考资料 0x1 LDAP介绍 1 LDAP出现的背景 LDAP(Lightweight Directory Access Pr ...

  9. Lucene的Query类介绍

    把Lucene的查询当成sql的查询,也许会笼统的明白些query的真相了. 查询分为大致两类,1:精准查询.2,模糊查询. 创建测试数据. private Directory directory; ...

随机推荐

  1. kendo ui treeview 标题太长时的自动换行

    添加以下CSS即可: div.k-treeview{white-space: normal;}

  2. 2018.09.09 bzoj4403: 序列统计(Lucas定理)

    传送门 感觉单调不降序列什么的不好做啊. 于是我们序列中下标为i的元素的值加上i,这样就构成了一个单调递增的序列. 问题就变成了: 求出构造长度分别为1 ~ n且每个元素的值在l+1 ~ r+n之间的 ...

  3. 2018.07.23[PA2015]Siano(线段树)

    [PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘 ...

  4. 18 Customers' Role in Good Customer Service 客户在高质量客服中的作用

    Customers' Role in Good Customer Service 客户在高质量客服中的作用 ⑴High-quality customer service is preached by ...

  5. MFC框架仿真<二>

  6. 被“1”和“l”给坑了

    由于输入法的原因,导致小写的英文字母“L”和阿拉伯数字“1”长得非常像,在写秘钥的时候很容易把看错.由于对方发秘钥的时候给的是图片,而且不太清晰,手动输入的时候把“1”写成“l”了,对了好几遍秘钥也没 ...

  7. PAT甲 1029. Median (25) 2016-09-09 23:11 27人阅读 评论(0) 收藏

    1029. Median (25) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given an incr ...

  8. VTK7.0.0编译安装心得

    配置:Win7(64bit)+VS2013+VTK700+QT5 (为了编译适应所用工业设备32bit,所有编译凑在32bit下进行) 预安装: (1)安装CMake软件,用于编译重构VTK源文件,编 ...

  9. C++ 引用 指针 使用举例

    1. 请看下程序 inline void CScanLineFill::removeOldNodeAET(AET* &aetList, const float yCurrent) { AET* ...

  10. opengl中场景变换|2D与3D互转换(转)

    opengl中场景变换|2D与3D互转换 我们生活在一个三维的世界——如果要观察一个物体,我们可以: 1.从不同的位置去观察它.(视图变换) 2.移动或者旋转它,当然了,如果它只是计算机里面的物体,我 ...