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 ...
随机推荐
- 网络开发之使用Web Service和使用WCF服务
判断是否有可用网络连接可以通过NetworkInterface类中的GetIsNetworkAvailable来实现: bool networkIsAvailable = networkInterfa ...
- matplotlib之pyplot 知识点滴
以下是一些常用地址链接,请参考 matplotlib 官方网址 plt.plot()函数细节 Matplotlib 中文用户指南 4.6 编写数学表达式 Python seaborn matplotl ...
- 使用T-sql建库建表建约束
为什么要使用sql语句建库建表? 现在假设这样一个场景,公司的项目经过测试没问题后需要在客户的实际环境中进行演示,那就需要对数据进行移植,现在问题来了:客户的数据库版本和公司开发阶段使用的数据库不兼容 ...
- Hibernate_01_初体验
hibernate开发的基本步骤: 编写配置文档hibernate.cfg.xml: 编写实体类: 生成对应实体类的映射文件并添加到配置文档中: 调用hibernate API进行测试. Hibern ...
- WPF度量系統
和Winform不同,WPF的度量單位不是像素,而是設備無關單位DIU,其大小總是1/96吋 那麽,WPF中一個寬度爲96的按鈕,到底是多少個像素呢? 答:取決於系統DPI. 計算公式爲:實際像素 = ...
- AI.框架理论.语义网.语言间距.孤单
刷个博客,转载自于科学网:AI.框架理论.语义网.语言间距.孤单 一:引言: AI几乎是计算机科学家的梦想,自动化比计算机发展的要早的多.早期的自动化节省了大量人力,激发了人类懒惰的滋长和对自身进化缓 ...
- react和vue对比
相同点 都支持服务器端渲染 都有Virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent规范 数据驱动视图 都有支持native的方案,React的 ...
- PAT_A1135#Is It A Red-Black Tree
Source: PAT A1135 Is It A Red-Black Tree (30 分) Description: There is a kind of balanced binary sear ...
- windows的时间同步工具:w32time
windows 客户端 官方文档自己排查可以看一下 如何在 Windows Server 中配置权威时间服务器 Windows Time Service Technical Reference Win ...
- html第三节课
表单 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...