数位DP -启示录
http://poj.org/problem?id=3208
一个魔鬼数为包含连续三个666的的数字,给个n(n<5e7)求第n个魔鬼数。
预处理f[i][j],f[i][3]表示由前i位数字构成所有可能的魔鬼数,需要注意这里允许前导0存在。
f[i][2]表示由i位数字构成的开头为2个6的非魔鬼数个数,
f[i][1]表示由i位数字构成的开头为1个6的非魔鬼数个数,
f[i][3]表示由i位数字构成的开头为3个6的魔鬼数个数,
之后从高位到低位填每个数,每个数从小到大枚举。
#include <cstdio>
#include <iostream>
using namespace std;
#define LL long long
LL f[][];
void init()
{
// f[1][1]=1;
// f[1][0]=9;
f[][]=;
for(int i=; i<=; i++)
{
f[i][]=(f[i-][]+f[i-][]+f[i-][])*;
f[i][]=f[i-][];
f[i][]=f[i-][];
f[i][]=f[i-][]+f[i-][]*;
}
} int main()
{
int t;
scanf("%d",&t);
init();
// for(int i=1; i<=15; i++)
// printf("%d ",f[i][3]);
while(t--)
{
int n;
scanf("%d",&n);
int p;
for(p=; f[p][]<n; p++);
int cnk=;
for(; p>=; p--)
{
for(int j=; j<=; j++)
{
int sum=;
if(j==||cnk>=)
{
int t=cnk+;
if(t>=) sum+=f[p-][]+f[p-][]+f[p-][];
else if(t==) sum+=f[p-][]+f[p-][];
else sum+=f[p-][];
sum+=f[p-][];
}
else
sum=f[p-][];
if(sum<n)
n-=sum;
else
{
if(j==)
cnk++;
else if(cnk<)
cnk=;
printf("%d",j);
break;
}
}
}
printf("\n");
}
}
数位DP -启示录的更多相关文章
- poj3208启示录——数位DP
题目:http://poj.org/problem?id=3208 数位DP,首先按位数预处理出每一种位数的情况,包括有多少个魔鬼数和有多少个以6开头的非魔鬼数,以便递推.累加等等: 然后先找出第X个 ...
- bzoj3209 花神的数论题——数位dp
题目大意: 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)—sum(N) 的乘积. 要对1000 ...
- 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP
[BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...
- bzoj1026数位dp
基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...
- uva12063数位dp
辣鸡军训毁我青春!!! 因为在军训,导致很长时间都只能看书yy题目,而不能溜到机房鏼题 于是在猫大的帮助下我发现这道习题是数位dp 然后想起之前讲dp的时候一直在补作业所以没怎么写,然后就试了试 果然 ...
- HDU2089 不要62[数位DP]
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 数位DP GYM 100827 E Hill Number
题目链接 题意:判断小于n的数字中,数位从高到低成上升再下降的趋势的数字的个数 分析:简单的数位DP,保存前一位的数字,注意临界点的处理,都是套路. #include <bits/stdc++. ...
- 数位dp总结
由简单到稍微难点. 从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用. 点开即可看题解. hdu3555 Bomb hdu3652 B-number hdu2089 ...
- 数位DP入门
HDU 2089 不要62 DESC: 问l, r范围内的没有4和相邻62的数有多少个. #include <stdio.h> #include <string.h> #inc ...
随机推荐
- 软件测试面试-必掌握的 Linux常用命令大全--2.0更新版!
- Visual Studio 2013 SDK 扩展之简介
Release Notes:[发行说明]启动记事本的扩展,以管理员身份运行验证通过. Getting Started Guide:[入门]使用[Ctrl + 1]更快捷打开记事本 More Info ...
- Linux apache的运行用户和用户组
我们在安装apache后,有时在上传文件的时候,提示没有权限或者是不可写,我们都会去查文件夹的权限. 通过ls -l /var/www/html/website可以很直观的看出我们文件和文件夹的权限, ...
- systemctl: command not found
可以使用service代替 service语法有一点区别 这里演示了错误语法和正确语法
- C# 关于X86/X64/AnyCpu 的关系
电脑硬件CPU可以分为x86与x64, x86的机器只能安装32位的操作系统,如XP, WIN7_86, x64的机器既可以安装32位的系统,又可以安装64位的系统,只是在x64的机器上安装32位的系 ...
- ELK搭建<一>:搭建ES集群
1.首先进入官网下载ES,如果下载最新之前的版本 点击past releases就行了. 2.解压后进入config修改配置文件elasticsearch.yml #集群名称 cluster.name ...
- ubuntu 下php + nginx
location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; root /home/roger/uicode/pcp_web; # # N ...
- linux常用命令及使用技巧(三)
文件管理与编辑 mkdir创建一个目录 mkdir [选项] 目录名 -m 设置存取权限 -p 可以一次创建多个目录 more命令读取文本文件,灭次显示一屏,并在每屏后暂停 cat命令将文件的内容输出 ...
- adjustsFontSizeToFitWidth 与 NSLineBreakByCharWrapping 无法共用
newLabel.lineBreakMode = NSLineBreakByCharWrapping; newLabel.text = content; newLabel.adjustsFontSiz ...
- winxp改AHCI不再蓝屏,不用改注册表,所有PC机通用
要用win8的pe 在通常的情况下,硬盘在BIOS中默认为原生IDE模式以获得最好的兼容性.对配件要求较高的W7,W8系统中,而通过开启硬盘AHCI模式,可以在一定程度上提升硬盘的性能表现.如果在ID ...