0x5C 数位统计DP
怎么说,数位DP还是我的噩梦啊,细节太恐怖了。
但是这章感觉又和之前的学的数位DP有差异?(应该是用DP预处理降低时间复杂度,好劲啊,不过以前都是记忆化搜索的应该不会差多少)
poj3208 f[i][0~2]表示第i位,开头连续j个6的情况数,[3]表示魔鬼数的个数,这样可以方便得出区间内有多少魔鬼数,不停的试填到底即可。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; LL f[][];
void initf()
{
f[][]=;
f[][]=,f[][]=,f[][]=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()
{
initf();
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int w=;while(f[w][]<n)w++; int h6=;
for(int i=w;i>=;i--)
{
for(int j=;j<=;j++)
{
LL cc=f[i-][];
if(j==||h6==)
for(int k=max(-h6-(j==),);k<=;k++)cc+=f[i-][k]; if(cc<n)n-=cc;
else
{
if(h6<)
{
if(j==)h6++;
else h6=;
}
printf("%d",j);
break;
}
}
}
printf("\n");
}
return ;
}
poj3208
月之谜 这题找不到原题,但是lyd有数据。一个看似很复杂多余实则很重要的定义:f[i][j][k][p]表示位数为i,数字和为j,对k取模等于p的数的个数,k这一维无法省略,原因是当前面增加一个数字j改变对应的模数也改变。预处理完了,就一位一位枚举,只有上限边缘是无法确定值的,上限之下都可以通过预处理求得。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
int MOD(int d,int mod){return (d%mod+mod)%mod;} int mi[],f[][][][];
void initf()
{
mi[]=;for(int i=;i<=;i++)mi[i]=mi[i-]*; memset(f,,sizeof(f));
for(int j=;j<=;j++)
for(int k=;k<=;k++)
f[][j][k][j%k]++;
for(int i=,mi=;i<=;i++,mi*=)
{
for(int m=;m<=;m++)
for(int j=m;j<=;j++)
for(int k=;k<=;k++)
for(int p=;p<;p++)
f[i][j][k][p]+=f[i-][j-m][k][MOD(p-mi*m,k)];
}
} int maxw(int i)
{
int ret=;
while(i!=)i/=,ret++;
return ret;
}
int getnum(int x,int i){return x/(mi[i])%;}
bool calc(int x)
{
int k=x,sum=;
while(k!=)sum+=k%,k/=;
if(sum==)return ;
return x%sum==;
} int getmoon(int x,int sum,int pun,int i)
{
if(i==)
{
int num=getnum(x,),ret=;
for(int i=;i<=num;i++)
{
x=x-x%+i;
if(calc(x)==true)ret++;
}
return ret;
} int num=getnum(x,i),ret=;
for(int m=;m<num;m++)
{
for(int j=max(,sum+m);j<=;j++)
ret+=f[i-][j-(sum+m)][j][MOD(-pun-mi[i]*m,j)];
}
ret+=getmoon(x,sum+num,pun+mi[i]*num,i-);
return ret;
} int main()
{
freopen("mystery.in","r",stdin);
freopen("mystery.out","w",stdout);
initf();
int L,R;
while(scanf("%d%d",&L,&R)!=EOF)
{
if(L==)printf("%d\n",getmoon(R,,,maxw(R)));
else printf("%d\n",getmoon(R,,,maxw(R))-getmoon(L-,,,maxw(L-)));
}
return ;
}
月之谜
0x5C 数位统计DP的更多相关文章
- 动态规划——区间DP,计数类DP,数位统计DP
本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...
- $BZOJ1799\ Luogu4127$ 月之谜 数位统计$DP$
AcWing Description Sol 看了很久也没有完全理解直接$DP$的做法,然后发现了记搜的做法,觉得好棒! 这里是超棒的数位$DP$的记搜做法总结 看完仿佛就觉得自己入门了,但是就像 ...
- $Poj3208$ 启示录 数位统计$DP$
Poj AcWing Description Sol 这题长得就比较像数位$DP$叭. 所以先用$DP$进行预处理,再基于拼凑思想,通过"试填法"求出最终的答案. 设$F[i] ...
- Codeforces 55D Beautiful Number (数位统计)
把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容: a positive integer number is beautiful if and only if it is ...
- [ACM] ural 1057 Amount of degrees (数位统计)
1057. Amount of Degrees Time limit: 1.0 second Memory limit: 64 MB Create a code to determine the am ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- bzoj 1026 DP,数位统计
2013-11-20 08:11 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1026 首先我们用w[i,j]表示最高位是第i位,且是j的 ...
- 【XSY2668】排列统计 DP
题目描述 给你一个长度为\(n\)的排列\(a\),每次要选择两个数,交换这两个数(这两个数可以相同).总共要交换\(k\)次. 最后要统计数列中有多少位置\(i\)满足\(\max_{j\leq i ...
- [BZOJ3992][SDOI2015]序列统计(DP+原根+NTT)
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1888 Solved: 898[Submit][Statu ...
随机推荐
- .htaccess的基本用法与介绍
●自定义错误页 .htaccess的一个应用是自定义错误页面,这将使你可以拥有自己的.个性化的错误页面(例如找不到文件时),而不是你的服务商提供的错误页或没有任何页面.这会让你的网站在出错的时候看上去 ...
- Android引导页
源码地址:https://github.com/myloften/IntroSliderSample 博客地址:http://blog.csdn.net/loften_93663469/article ...
- Runtime的相关知识
Runtime是近年来面试遇到的一个高频方向,也是我们平时开发中或多或少接触的一个领域,那么什么是runtime呢?它又可以用来做什么呢? 什么是Runtime?平时项目中有用过么? OC是一门动态性 ...
- 总结Linq或者lamdba的写法
var head = new OmsEcorderHead { PkEcorderHead = OrderHeadId, AppId = appid, Integral = Convert.ToDec ...
- 【sqli-labs】 less25a GET- Blind based -All you OR&AND belong to us -Intiger based(GET型基于盲注的去除了or和and的整型注入)
因为过滤是针对输入的字符串进行的过滤,所以如果过滤了or and的话,提交id=1和id=and1结果应该相同 http://localhost/sqli-labs-master/Less-25a/? ...
- 【sqli-labs】 less20 POST - Cookie injections - Uagent field - Error based (POST型基于错误的cookie头部注入)
以admin admin成功登陆之后,保存并显示了cookies信息 如果不点击Delete Your Cookie!按钮,那么访问 http://localhost/sqli-labs-master ...
- js 习题
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- jq 跨域请求
//使用getJSON <script type="text/javascript"> $(function () { $("#btn2").cli ...
- webpack核心提炼
基本是学习的时候在网上整理的资料,并非自己原创,这篇文章的的主要目的是记录webpack.config.js的配置方式.可能也有不少错误,欢迎指正!! 一.应用场景 前端模块化开发.功能拓展.css预 ...
- 【转载】Java IO基础总结
Java中使用IO(输入输出)来读取和写入,读写设备上的数据.硬盘文件.内存.键盘......,根据数据的走向可分为输入流和输出流,这个走向是以内存为基准的,即往内存中读数据是输入流,从内存中往外写是 ...