Apocalypse Someday

定义一个数是合法的,当且仅当中间出现至少一个连续的大于三个的6,求第x个合法的数,\(x\leq 50,000,000\)

首先,注意到求第几个,即想到试填法,而试填法关键在于确定了这个状态下的方案数,记住这个,接下来就很好理解了。

显然要表现长度,又因为要表现合法,于是设\(f[i][j]\)表示有i位的数,状态为j(0表示最高位没有6,1有1个6,2表示有连续的两个6的不合法的数,3表示这是一个合法的数)的方案数,因此不难有

\[f[i][0]=(f[i-1][0]+f[i-1][1]+f[i-1][2])\times 9
\]

\[f[i][1]=f[i-1][0],f[i][2]=f[i-1][1],f[i][3]=10\times f[i-1][3]+f[i-1][2]
\]

边界:\(f[0][0]=1\)

于是我们可以以此从高位到低位进行试填,数字从小到大,注意特判6,比如填到第i位,此处填了一个6,前面有2个连续的6紧挨着第i位,于是不但\(f[i-1][3]\)为合法的方案,还有\(f[i-1][1]+f[i-1][2]\),同理可推出前面有1个6,注意前面3个6时,不管这里填什么,方案都是\(f[i-1][0]+f[i-1][1]+f[i-1][2]+f[i-1][3]\)

#include <iostream>
#include <cstdio>
#define il inline
#define ri register
#define int long long
using namespace std;
int dp[21][4];
il int max(int,int);
il void read(int&),prepare();
main(){
int lsy;read(lsy),prepare();
while(lsy--){
int x;read(x);
int w(0),i,j,t6(0),cnt;
while(dp[w][3]<x)++w;
while(w){
for(i=0;i<10;++i){
cnt=dp[w-1][3];
if(i==6||t6>2)
for(j=max(2-t6,0);j<3;++j)
cnt+=dp[w-1][j];
if(cnt>=x){putchar(i+48);break;}
else x-=cnt;
}if(i==6)++t6;else if(t6<3)t6&=0;--w;
}putchar('\n');
}
return 0;
}
il int max(int a,int b){
return a>b?a:b;
}
il void prepare(){
dp[0][0]=1;
for(int i(1);i<=20;++i)
dp[i][1]=dp[i-1][0],dp[i][2]=dp[i-1][1],dp[i][3]=10*dp[i-1][3]+dp[i-1][2],
dp[i][0]=(dp[i-1][0]+dp[i-1][1]+dp[i-1][2])*9;
}
il void read(int &x){
x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

最新文章

  1. 为Tcl编写C的扩展库
  2. EF MySql 配置文件
  3. 12,SFDC 管理员篇 - 页面配置
  4. 重新安装phpMyAdmin无法运行的解决一例
  5. Notepad++中的复活节彩蛋(easter egg)
  6. Linux下tomcat使用
  7. NGINX关于配置PATHINFO
  8. yahoo给出的关于网站优化的建议
  9. CodeForces 662D International Olympiad
  10. 【转】HTTP响应报文与工作原理详解
  11. 深度学习的2016: NIPS 2016速览
  12. 入坑IT都快十年了
  13. [翻译 EF Core in Action 2.0] 查询数据库
  14. ASP.NET 配置log4net启用写错误日志功能
  15. HTTP 02 HTTP1.1 协议
  16. synchronized的简单用法
  17. Python+OpenCV图像处理(五)—— 像素运算
  18. 图片处理工具类 util
  19. 【Java算法】获得一个随机字符串
  20. HTTP、TCP、IP、协议

热门文章

  1. &lt;爬虫&gt;相关的知识
  2. hdu 6437 /// 最小费用最大流 负花费 SPFA模板
  3. Oracle数据库与MySQL的不同点
  4. css3条纹进度条
  5. while循环和for循环
  6. Mybatis中$和#取数据的区别
  7. nodejs mysql 连接数据库
  8. Python自学:第四章 遍历切片
  9. C中为什么不能用==比较字符串?
  10. php Excel导出功能