【BZOJ】1799: [Ahoi2009]self 同类分布
【题意】给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数。1 ≤ a ≤ b ≤ 10^18
【算法】数位DP
【题解】
感觉这种方法很暴力啊。
枚举数位和1~162(不能枚举0,不然会模0,相当于除0),记忆化f[pos][sum][val],sum表示当前数位和,val表示数字取模枚举的数位和。
每次sum+i和(val*10+i)%MOD转移。
sum用减法优化,即记忆化(MOD-sum),但是枚举过程中都要memset,导致效率低下,记忆化效果很差。
要什么方法才能跑1.3s啊,%%%。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int maxn=;
ll f[maxn][][],a[maxn],b[maxn],c[maxn],n,MOD;
ll dfs(int pos,int sum,int val,int limit){
if(sum>MOD)return ;
if(pos==-){if(sum==MOD&&val==)return ;else return ;}
if(!limit&&~f[pos][MOD-sum][val])return f[pos][MOD-sum][val]; int up=limit?a[pos]:;
ll ans=;
for(int i=;i<=up;i++){
ans+=dfs(pos-,sum+i,(val*+i)%MOD,limit&&i==up);
}
if(!limit)f[pos][MOD-sum][val]=ans;
return ans;
}
int main(){
ll A,B,cntb=,cntc=;
scanf("%lld%lld",&A,&B);
A--;
while(A){
b[cntb++]=A%;
A/=;
}
while(B){
c[cntc++]=B%;
B/=;
}
ll ans=;
for(int i=;i<=;i++){//不能模0啊!!!模0也是除0啊!!!
memset(f,-,sizeof(f));
MOD=i;
n=cntb;
for(int j=;j<n;j++)a[j]=b[j];
ans-=dfs(n-,,,);
n=cntc;
for(int j=;j<n;j++)a[j]=c[j];
ans+=dfs(n-,,,);
}
printf("%lld",ans);
return ;
}
【BZOJ】1799: [Ahoi2009]self 同类分布的更多相关文章
- bzoj 1799: [Ahoi2009]self 同类分布 数位dp
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Descripti ...
- BZOJ 1799 - [AHOI2009]self 同类分布 - 枚举 数位DP
Description 找出$[L, R]$ 区间内有多少数, 各位数字和 能整除原数 Solution 枚举每个可能的数字和, 进行数位DP即可 , 水爆 Code #include<cstd ...
- bzoj 1799: [Ahoi2009]self 类似的分布 解读
[原标题] 1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MB Submit: 554 Solved: 194 [id ...
- [Ahoi2009]self 同类分布
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MBSubmit: 2357 Solved: 1079[Submit][ ...
- bzoj1799: [Ahoi2009]self 同类分布
数位dp 先从1到162枚举各位数之和 s[i][j][k][l]表示i位数,第一位小于等于j,当前各位数字和为k,当前取模余数为l的方案数 然后脑补一下转移就行了 详见代码 #include < ...
- [BZOJ1799][Ahoi2009]self 同类分布(数位dp)
题目描述 给出两个数 a,ba,b ,求出 [a,b][a,b] 中各位数字之和能整除原数的数的个数. 输入输出格式 输入格式: 一行,两个整数 aa 和 bb 输出格式: 一个整数,表示答案 输入输 ...
- BZOJ1799 [Ahoi2009]self 同类分布[数位DP]
求出[a,b]中各位数字之和能整除原数的数的个数. 有困难的一道题.被迫看了题解:枚举每一个各位数字的和($<=162$),设计状态$f[len][sum][rest]$表示dp后面$len$位 ...
- 【数位dp】bzoj1799: [Ahoi2009]self 同类分布
各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条 ...
- 【AHOI2009】同类分布 题解(数位DP)
题目大意:求$[l,r]$中各位数之和能被该数整除的数的个数.$0\leq l\leq r\leq 10^{18}$. ------------------------ 显然数位DP. 搜索时记录$p ...
随机推荐
- XStream轻松转换xml和java对象
首先引入所需的jar: xstream-1.4.9.xpp3_min-1.1.4c.dom4j-1.6.1, 或用maven管理jar包时在pom.xml中添加: <!-- https://mv ...
- elasticsearch-mathc和term的区分
elasticsearch和mysql在思想上是有不同的,elasticsearch有分词一说,比如北京奥运分词成北京,奥运,北京奥运.分词要要考虑两点,一个是查询字符串要不要分词,还有就是原存储字段 ...
- 《.NET 微服务:适用于容器化 .NET 应用的体系结构》关键结论
作为总结和要点,以下是本指南中最重要的结论.1 使用容器的好处: 基于容器的解决方案有节约成本的好处,因为容器是针对生产环境中缺少依赖而导致的部署问题提出的解决方案.容器能够显著改善devops和生产 ...
- C#的内存管理
栈的填充方式是从高到低,高数位到低数位的填充 堆的填充方式是从低向高,低数位到高数位的填充 内存堆上没有被栈引用的东西,才会被垃圾回收器回收. GC垃圾自动回收会重新排列堆里面的内存占用,自动回收运行 ...
- Django源码分析之权限系统_擒贼先擒王
乍见 Django内置的权限系统已经很完善了,加上django-guardian提供的功能,基本上能满足大部分的权限需求.暂且不说django-guardian,我们先来看下Django内置的权限系统 ...
- (原创)最小生成树之Prim(普里姆)算法+代码详解,最懂你的讲解
Prim算法 (哈欠)在创建最小生成树之前,让我们回忆一下什么是最小生成树.最小生成树即在一个待权值的图(即网结构)中用一个七拐八绕的折线串连起所有的点,最小嘛,顾名思义,要权值相加起来最小,你当然可 ...
- [CH5302]金字塔
题面 虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下.经过多年的研究,科学家对这座金字塔的内部结构已经有所了解.首先,金字塔由若干房间组成,房间之间连有通道.如果把房间看作节点, ...
- CentOS 6.5 下安装redis
1.登录虚拟机后,直接输入命令:yum -y install redis 会出现一个错误: 是因为少了epel源, 2.运行:yum -y install epel-release 最后出现 Comp ...
- c#程序中的AssemblyInfo.cs
在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共 ...
- 创建一个doc对象时候 如果读取了一个已存在的xml对象时候 该xml对象的结构已存在doc中 当改变该doc结构时候 不需要创建新的doc对象
创建一个doc对象时候 如果读取了一个已存在的xml对象时候 该xml对象的结构已存在doc中 当改变该doc结构时候不 需要创建新的doc对象 直接添加即可 他会同步过去