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 ...
随机推荐
- # --with-http_random_index_module模块
作用: 从目录中随机选取一个随机作为主业 环境 nginx -V 检测是否已经安装了该模块 语法 案例 在/usr/share/nginx下随机创建3个html文件 修改配置文件
- NGinx 负载均衡作用
1.负载均衡介绍: 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.其工作模式为将外部发送来的请求均匀分配到对称结构中的 ...
- AFN上传多张图片
AFN上传多张图片代码: AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; sessionManager.r ...
- font使用
font连写属性 font-style font-variant font-weight font-size/line-height font-family font-size与font-fam ...
- php数据库批量删除
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- springboot 多数据源的实现
相关的依赖 yml配置 java配置类: DataSourceConfigurerjava /** * Created by zhiqi.shao on 2017/11/20. */ @Configu ...
- node.js的querystring模块
querystring主要是用于对字符串进行操作和解析.共有四个方法:querystring.parse,querystring.stringify,querystring.escape,querys ...
- 移动端mui常用方法
本文分享一些用Mui的时候所采的坑 1.mui中上拉刷新事件a标签中的链接.元素onclick事件在手机上点击不了 mui('body').on('tap','a',function(){docume ...
- GFS分布式文件系统环境部署与管理
Gluster分布式文件系统 准备环境五台虚拟机 创建/gfs目录,把软件包全部拷贝目录 把yum仓库的源放进bak下才能执行以下脚本 并指定主机名这四台机器都要执行脚本 [root@localhos ...
- Super Poker II UVA - 12298 FFT_生成函数
Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long #define double long do ...