[BZOJ 1799] self 同类分布
Link:
Solution:
一句话的题目,看得爽,做得烦
一般这类和数位相关的都是数位$dp$吧
不过一开始还是感觉不太可做,毕竟每个数模数不同
但要发现,模数最高也只可能为$9*19=171$,
于是只要将数按照他们的数位和(即模数)分类计算即可
这样便暴力解决了模数不同的问题
设$dp[sp][sum][rmd][lmt]$表示:
枚举到第$sp$高位,剩下的数的和位$sum$,此时对$mod$余$rmd$时的方案数(lmt表示是否达到上界)
感觉数位$dp$还是用记忆化搜索写起来逻辑比较清晰吧
Code:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MAXN=; //n可能为19,sum最大为171
int vis[][MAXN][MAXN][],mod,dgt,cur,num[];
ll a,b,dp[][MAXN][MAXN][]; ll dfs(int sp,int sum,int rmd,int lmt)
{
if(!sp) return !sum && !rmd;
if(vis[sp][sum][rmd][lmt]==cur) return dp[sp][sum][rmd][lmt];
vis[sp][sum][rmd][lmt]=cur;ll ret=; int l=max(,sum-(sp-)*),r=min((lmt)?num[sp]:,sum);
for(int i=l;i<=r;i++)
ret+=dfs(sp-,sum-i,(rmd*+i)%mod,lmt&(i==num[sp]));
return dp[sp][sum][rmd][lmt]=ret;
} ll solve(ll x)
{
ll ret=;
for(dgt=;x;x/=) num[++dgt]=x%;
for(mod=;mod<=dgt*;mod++)
cur++,ret+=dfs(dgt,mod,,);
return ret;
} int main()
{
scanf("%lld%lld",&a,&b);
printf("%lld\n",solve(b)-solve(a-));
return ;
}
Review:
1、少用$memset$,尽量在使用时顺便初始化
为了区分不同次的调用,可以在每一次调用打上不同的标记
2、在$dp$时难以处理模数不同的情况
考虑将数据分类后直接暴力所有可能的模数
3、$1e18$可能有19位,$MAXN$要设为175
(一开始扫了一眼题解上$MAXN$为165,以后还是要自己算啊……)
[BZOJ 1799] self 同类分布的更多相关文章
- HYSBZ - 1799 self 同类分布
self 同类分布 HYSBZ - 1799 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.Sample Input 10 19 Sample Output 3 Hint [约束条件] ...
- bzoj 1799: [Ahoi2009]self 同类分布 数位dp
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Descripti ...
- bzoj 1799: [Ahoi2009]self 类似的分布 解读
[原标题] 1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MB Submit: 554 Solved: 194 [id ...
- 【BZOJ1799】[AHOI2009]同类分布(动态规划)
[BZOJ1799][AHOI2009]同类分布(动态规划) 题面 BZOJ 洛谷 题解 很容易想到数位\(dp\),然而数字和整除原数似乎不好记录.没关系,直接枚举数字和就好了,这样子就可以把整除原 ...
- [BZOJ1799][AHOI2009]同类分布(数位DP)
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MBSubmit: 1635 Solved: 728[Submit][S ...
- [Ahoi2009]self 同类分布
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MBSubmit: 2357 Solved: 1079[Submit][ ...
- BZOJ1799 self 同类分布 数位dp
BZOJ1799self 同类分布 去博客园看该题解 题意 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. [约束条件]1 ≤ a ≤ b ≤ 10^18 题解 1.所有的位数之和&l ...
- 洛谷 P4127 [AHOI2009]同类分布 解题报告
P4127 [AHOI2009]同类分布 题目描述 给出两个数\(a,b\),求出\([a,b]\)中各位数字之和能整除原数的数的个数. 说明 对于所有的数据,\(1 ≤ a ≤ b ≤ 10^{18 ...
- P4127 [AHOI2009]同类分布
P4127 [AHOI2009]同类分布 题解 好的,敲上数位DP DFS板子 记录一下填的各位数字之和 sum ,然后记录一下原数 yuan 最后判断一下 yuan%sum==0 不就好啦??? ...
随机推荐
- 于是他错误的点名开始了 [Trie]
于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已 ...
- getActionBar为null的解决以及ActionBar的Back键
http://blog.csdn.net/lincyang/article/details/46286895
- inflate
LayoutInflater是用 来找res/layout/下的xml布局文件,并且实例化 https://www.cnblogs.com/savagemorgan/p/3865831.html
- SpringMVC学习 -- 使用 POJO 对象绑定请求参数值
Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配 , 自动为该对象填充属性值 , 支持级联属性.如:address.province. package com.itdoc.spri ...
- noip车站分级 拓扑排序
题目传送门 这道题呢 每次输入一段数就把1~n里面没有在这组数里面的数和他们连一波 表示这些数比他们等级低 然后就搞一搞就好了哇 #include<cstdio> #include< ...
- float/文档流
float : left | right | none | inherit; 文档流是文档中可显示对象在排列时所占用的位置. 浮动的定义: 使元素脱离文档流,按照指定方向发生移动,遇到父级边界或者相邻 ...
- 2017年上海金马五校程序设计竞赛:Problem B : Sailing (广搜)
Description Handoku is sailing on a lake at the North Pole. The lake can be considered as a two-dime ...
- [bzoj2038][2009国家集训队]小Z的袜子(hose)——莫队算法
Brief Description 给定一个序列,您需要处理m个询问,每个询问形如[l,r],您需要回答在区间[l,r]中任意选取两个数相同的概率. Algorithm Design 莫队算法入门题目 ...
- EffectiveJava读书笔记
less, but is more. 创建和销毁对象 避免创建不必要对象 消除过期的对象引用 使可变性最小 泛型 用标记接口定义类型 检查参数有效性 返回零长度的数组或集合,而不是null 需要精确答 ...
- BeeFramework 系列一 安装篇(Arc)
http://ilikeido.iteye.com/blog/1881390 Beeframework 是一款iOS快速开发框架,它以UISignal强大的路由功能替代原有Delegate方式,完成复 ...