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 ...
随机推荐
- netty 引用计数对象(reference counted objects)
[Netty官方文档翻译]引用计数对象(reference counted objects) http://damacheng009.iteye.com/blog/2013657
- Unity引擎的Player Settings介绍
我用的是unity5.4.3版本的 一.窗口打开: 从菜单栏查看播放器设置,选择 Edit->Project Settings->Player 二.全局设置 第一部分: Company N ...
- ★Java-----记事本编译、运行时注意事项
1.文件名需要与源代码中公共类的名字相同,即class后面的名字: 2.Java中严格区分大小写: 3.记事本编辑好之后保存文件后缀必须是". java": 4.运行cmd,dos ...
- IIS7部署网站的一些细节问题。
1.不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况. 这个错误的原因是在 IIS 7中 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项.要取消锁定可以以 ...
- dubbo之集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试. 集群容错模式 1. Failover Cluster 失败自动切换,当出现失败,重试其它服务器 .通常用于读操作,但 ...
- MxNet : use the MxNet windows versioin
The MxNet needs the following thirdparties: 1. lapack complie lapack-3.6.1: download the lapack-3.6 ...
- servlet_获取初始化参数
在web.xml的<servlet>标签中增添 <init-param> <param-name>XXX</param-name> <param- ...
- 触发a标签
var aLink = document.createElement("a"); aLink.download = ''; aLink.href = url; if (docume ...
- 【转载】servlet三大作用域:request,session,application
javaweb开发中Servlet三大域对象的应用(request.session.application(ServletContext)). 1. requestrequest是表示一个请求,只要发 ...
- js数组操作find查找特定值结合es6特性
js数组操作find查找特定值结合es6特性