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. 【POJ 1201 Intervals】

    Time Limit: 2000MSMeamory Limit: 65536K Total Submissions: 27949Accepted: 10764 Description You are ...

  2. POJ2195:Going Home (最小费用最大流)

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26212   Accepted: 13136 题目链接 ...

  3. POJ 2398 Toy Storage 二分+叉积

    Description Mom and dad have a problem: their child, Reza, never puts his toys away when he is finis ...

  4. hadoop删除节点和添加节点

    从hadoop移除机器把需要移除的机器增加到exclueds文件中,强制刷新datanode列表,等待decommission 状态正常后,即可停机下架,如有必要在namenode执行balancer ...

  5. Docker Community Edition for CentOS

    Docker CE for CentOS Docker CE for CentOS distribution is the best way to install the Docker platfor ...

  6. ES6学习笔记(五)—— 编程风格

    1. 块级作用域 let 取代 var —— let 只在声明的代码块内有效,而且不存在变量提升的效用 const 取代 let —— const 比较符合函数式编程的思想,运算不改变值,只是新建值: ...

  7. sencha touch 模仿tabpanel导航栏TabBar的实现代码

    这篇文章介绍了sencha touch 模仿tabpanel导航栏TabBar的实例代码,有需要的朋友可以参考一下 基于sencha touch 2.2所写 效果图: 代码: /* *模仿tabpan ...

  8. centos7装机时更改网卡名为eth0操作

  9. ZOJ1450 Minimal Circle

    You are to write a program to find a circle which covers a set of points and has the minimal area. T ...

  10. 【洛谷 P1651】 塔 (差值DP)

    题目链接 题意:\(n\)个木块放到两个塔里,每个木块可放可不放,使得两塔高度相同且高度最大,求最大高度. 这个差值\(DP\)的思维难度还是很大的,没想出来,我就打了一个\(dfs\)骗了好像\(2 ...