1799: [Ahoi2009]self 同类分布

Time Limit: 50 Sec  Memory Limit: 64 MB
Submit: 1635  Solved: 728
[Submit][Status][Discuss]

Description

给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数。

Input

Output

Sample Input

10 19

Sample Output

3

HINT

【约束条件】1 ≤ a ≤ b ≤ 10^18

Source

设计好状态后就是比较简单的数位DP了,实际上数位DP就是记录了中间状态的搜索。

首先枚举各个位上的数之和为mod,然后它的贡献是所有数位和为mod且这个数本身%mod=0的数的个数,设f[i][sm][md]表示考虑从高到低前i位,前i位的数位和为sm,数本身%mod=md的数的合法个数,最终贡献为f[len][0][0]。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (ll i=l; i<=r; i++)
typedef long long ll;
using namespace std; ll L,R,ans,mod,a[21],P[21],f[21][170][170]; ll dfs(ll x,ll sm,ll md,ll lim){
if (!x) return (sm==mod) && !md;
if (!lim && ~f[x][sm][md]) return f[x][sm][md];
ll res=0;
rep(j,0,(lim?a[x]:9)) res+=dfs(x-1,sm+j,(j*P[x-1]+md)%mod,lim && j==a[x]);
if (!lim) f[x][sm][md]=res;
return res;
} ll calc(ll n){
if (!n) return 0;
memset(f,-1,sizeof(f));
P[0]=1; rep(i,1,18) P[i]=(P[i-1]*10)%mod;
ll len=0; while (n) a[++len]=n%10,n/=10;
return dfs(len,0,0,1);
} int main(){
freopen("bzoj1799.in","r",stdin);
freopen("bzoj1799.out","w",stdout);
scanf("%lld%lld",&L,&R);
for (mod=1; mod<=162; mod++) ans+=calc(R)-calc(L-1);
printf("%lld\n",ans);
return 0;
}

[BZOJ1799][AHOI2009]同类分布(数位DP)的更多相关文章

  1. BZOJ1799 self 同类分布 数位dp

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

  2. [luogu4127 AHOI2009] 同类分布 (数位dp)

    传送门 Solution 裸数位dp,空间存不下只能枚举数字具体是什么 注意memset最好为-1,不要是0,有很多状态答案为0 Code //By Menteur_Hxy #include < ...

  3. BZOJ1799 [Ahoi2009]self 同类分布[数位DP]

    求出[a,b]中各位数字之和能整除原数的数的个数. 有困难的一道题.被迫看了题解:枚举每一个各位数字的和($<=162$),设计状态$f[len][sum][rest]$表示dp后面$len$位 ...

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

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

  5. bzoj1799同类分布——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1799 数位DP. 1.循环方法 预处理出每个位数上,和为某个数,模某个数余某个数的所有情况: ...

  6. BZOJ 1799 同类分布(数位DP)

    给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1<=a<=b<=1e18. 注意到各位数字之和最大是153.考虑枚举这个东西.那么需要统计的是[0,a-1]和[0,b ...

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

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

  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. php通过composer添加一个包以后,无法通过git将这个包的代码文件提交上去

    实际上是因为 vender 包中包含 有.git 文件,是composer 下载时下载了 该项目的github源码. 就是参数 源码优先 --prefer-source composer update ...

  2. [SCOI2010]生成字符串 题解(卡特兰数的扩展)

    [SCOI2010]生成字符串 Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数 ...

  3. h5 canvas动画,不知道谁写的

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. Linux下libevent安装与示例

    http://www.cnblogs.com/kunhu/p/3632225.html

  5. pytesser模块WindowsError错误解决方法

    在使用pytesser做图片文字识别时遇到 WindowsError: [Error 2] 错误,报错内容如下: Traceback (most recent call last): File &qu ...

  6. 短信API——短信验证码

    简介 短信服务(Short Message Service.SMS)是指通过调用短信发送API,将指定短信内容发送给指定手机用户. 阿里云短信服务 阿里云短信服务产品介绍:https://www.al ...

  7. webservice使用

    soap方法 一:PHP本身的SOAP 所有的webservice都包括服务端(server)和客户端(client). 要使用php本身的soap首先要把该拓展安装好并且启用.下面看具体的code ...

  8. 端口扫描———nmap

    nmap教程之nmap命令使用示例(nmap使用方法) 浏览:8268 | 更新:2014-03-29 17:23 Nmap是一款网络扫描和主机检测的非常有用的工具.Nmap是不局限于仅仅收集信息和枚 ...

  9. Makefile的使用方法

    转自:http://blog.chinaunix.net/uid-403164-id-2407545.html 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Wind ...

  10. AXFR和IXFR区域传输及原理

    由于区域在DNS中发挥着重要的作用,因此希望在网络上的多个DNS服务器中提供区域,以提供解析名称查询时的可用性和容错.否则,如果使用单个服务器而该服务器没有响应,则该区域中的名称查询会失败.对于主要区 ...