Link:

BZOJ 1799 传送门

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 同类分布的更多相关文章

  1. HYSBZ - 1799 self 同类分布

    self 同类分布 HYSBZ - 1799 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.Sample Input 10 19 Sample Output 3 Hint [约束条件] ...

  2. bzoj 1799: [Ahoi2009]self 同类分布 数位dp

    1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Descripti ...

  3. bzoj 1799: [Ahoi2009]self 类似的分布 解读

    [原标题] 1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MB Submit: 554  Solved: 194 [id ...

  4. 【BZOJ1799】[AHOI2009]同类分布(动态规划)

    [BZOJ1799][AHOI2009]同类分布(动态规划) 题面 BZOJ 洛谷 题解 很容易想到数位\(dp\),然而数字和整除原数似乎不好记录.没关系,直接枚举数字和就好了,这样子就可以把整除原 ...

  5. [BZOJ1799][AHOI2009]同类分布(数位DP)

    1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MBSubmit: 1635  Solved: 728[Submit][S ...

  6. [Ahoi2009]self 同类分布

    1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MBSubmit: 2357  Solved: 1079[Submit][ ...

  7. BZOJ1799 self 同类分布 数位dp

    BZOJ1799self 同类分布 去博客园看该题解 题意 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. [约束条件]1 ≤ a ≤ b ≤ 10^18 题解 1.所有的位数之和&l ...

  8. 洛谷 P4127 [AHOI2009]同类分布 解题报告

    P4127 [AHOI2009]同类分布 题目描述 给出两个数\(a,b\),求出\([a,b]\)中各位数字之和能整除原数的数的个数. 说明 对于所有的数据,\(1 ≤ a ≤ b ≤ 10^{18 ...

  9. P4127 [AHOI2009]同类分布

    P4127 [AHOI2009]同类分布 题解 好的,敲上数位DP  DFS板子 记录一下填的各位数字之和 sum ,然后记录一下原数 yuan 最后判断一下  yuan%sum==0 不就好啦??? ...

随机推荐

  1. 于是他错误的点名开始了 [Trie]

    于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已 ...

  2. getActionBar为null的解决以及ActionBar的Back键

    http://blog.csdn.net/lincyang/article/details/46286895

  3. inflate

    LayoutInflater是用 来找res/layout/下的xml布局文件,并且实例化 https://www.cnblogs.com/savagemorgan/p/3865831.html

  4. SpringMVC学习 -- 使用 POJO 对象绑定请求参数值

    Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配 , 自动为该对象填充属性值 , 支持级联属性.如:address.province. package com.itdoc.spri ...

  5. noip车站分级 拓扑排序

    题目传送门 这道题呢 每次输入一段数就把1~n里面没有在这组数里面的数和他们连一波 表示这些数比他们等级低 然后就搞一搞就好了哇 #include<cstdio> #include< ...

  6. float/文档流

    float : left | right | none | inherit; 文档流是文档中可显示对象在排列时所占用的位置. 浮动的定义: 使元素脱离文档流,按照指定方向发生移动,遇到父级边界或者相邻 ...

  7. 2017年上海金马五校程序设计竞赛:Problem B : Sailing (广搜)

    Description Handoku is sailing on a lake at the North Pole. The lake can be considered as a two-dime ...

  8. [bzoj2038][2009国家集训队]小Z的袜子(hose)——莫队算法

    Brief Description 给定一个序列,您需要处理m个询问,每个询问形如[l,r],您需要回答在区间[l,r]中任意选取两个数相同的概率. Algorithm Design 莫队算法入门题目 ...

  9. EffectiveJava读书笔记

    less, but is more. 创建和销毁对象 避免创建不必要对象 消除过期的对象引用 使可变性最小 泛型 用标记接口定义类型 检查参数有效性 返回零长度的数组或集合,而不是null 需要精确答 ...

  10. BeeFramework 系列一 安装篇(Arc)

    http://ilikeido.iteye.com/blog/1881390 Beeframework 是一款iOS快速开发框架,它以UISignal强大的路由功能替代原有Delegate方式,完成复 ...