Description

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


Solution

设 \(f[i][j][k][q]\) 表示 枚举到第 i 位,当前数字为 j ,各个数位上的数字和为 k,原数模 k 的余数为 q

可以发现,从 i - 1 位推到第 i 位并不好推,所以可以转变一下

用第 i 位推第 i + 1 位

显然有

\[f[i+1][s][j+s][(k+s\times 10^i)\%x]=\sum_{t=0}^9f[i][t][j][k]
\]

约束条件为 \(i\in [1,len]\),\(j\in [0,\min\{i\times 9,x\}]\),\(s\in[0,9]\),\(k\in[0,x)\)

其中 \(i\) 是枚举位数,\(s\) 是下一位上的数,\(t\) 是当前位上的数,\(x\) 是总数位和,\(k\) 是余数,\(j\) 是当前累计的数位和

然后对于答案的统计:

  • 对于位数小于当前位的,\(ans+=f_{i,10,x,0}\) \(−\) \(f_{i,0,x,0}\)
  • 对于位数相同的,计算小于最高位的 \(ans+=f_{num_i,s,x,0}\)
  • 然后对于当前不同的一位进行讨论即可,计算出后面所需要的余数,然后加和

\(num_i\) 是 \(i\) 的最高位,\(x\) 是要求的位数和

答案就是所有位数和的 \(ans\) 之和, 同时满足满足 \([l,r]\)


Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#define int long long using namespace std; int A,B;
int f[20][11][172][172];
int highest[20],a[20][2];
int Mod,Pow[20]; inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0' &&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return w*s;
} inline int Min(int x,int y){return x<y?x:y;}
inline void F(int x,int y){highest[y]=0;while(x){a[++highest[y]][y]=x%10;x/=10;}} inline void init(int x,int len){
memset(f,0,sizeof f);
for(register int i=0;i<=9;i++) f[1][i][i][i%x]++,f[1][10][i][i%x]++;
for(register int i=1;i<len;i++)
for(register int j=0;j<=Min(i*9,x);j++)
for(register int k=0;k<x;k++){
if(f[i][10][j][k])for(register int s=0;s<=9;s++){
f[i+1][s][j+s][(k+s*Pow[i])%x]+=f[i][10][j][k];
f[i+1][10][j+s][(k+s*Pow[i])%x]+=f[i][10][j][k];
}
}
Mod=x;
} inline int solve(int s,int x){
int ans=0,num=a[highest[s]][s],now=num;
for(register int i=1;i<highest[s];i++) ans+=f[i][10][x][0]-f[i][0][x][0];//处理最高位之前
for(register int i=1;i<a[highest[s]][s];i++) ans+=f[highest[s]][i][x][0];//处理最高位
if(x<now) return ans;
for(register int i=highest[s]-1;i;i--){
int tot=(x-num*Pow[i]%x)%Mod;
for(register int j=0;j<a[i][s];j++)ans+=f[i][j][x-now][tot];//操作最高位
now+=a[i][s];num=(num*10+a[i][s])%Mod;
if(x<now) break;
}
return ans;
} signed main(){
int ans=0;A=read();B=read();F(A,0),F(B+1,1);Pow[0]=1;
for(register int i=1;i<=18;i++) Pow[i]=Pow[i-1]*10;
for(register int i=1;i<=highest[1]*9;i++){init(i,highest[1]);ans+=solve(1,i)-solve(0,i);}
printf("%lld",ans);
return 0;
}

洛谷P4127的更多相关文章

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

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

  2. 洛谷 P4127 [AHOI2009]同类分布

    题意简述 求l~r之间各位数字之和能整除原数的数的个数. 题解思路 数位DP 代码 #include <cstdio> #include <cstring> typedef l ...

  3. 洛谷P4127同类分布

    传送 我们要在dfs的板子里记录哪些量呢?当前填的所有数的和sum?当前填的数构成的数值all? sum可以留下,数值就扔掉叭.数值最大是1e18,要是留下,在g数组里有一维的大小是1e18.也许可以 ...

  4. bzoj1799(洛谷4127)同类分布(月之谜)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1799 https://www.luogu.org/problemnew/show/P4127 ...

  5. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  6. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  7. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  8. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  9. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

随机推荐

  1. JAVA十大经典排序算法最强总结(含JAVA代码实现)

    0.排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排 ...

  2. 从最长公共子序列问题理解动态规划算法(DP)

    一.动态规划(Dynamic Programming) 动态规划方法通常用于求解最优化问题.我们希望找到一个解使其取得最优值,而不是所有最优解,可能有多个解都达到最优值. 二.什么问题适合DP解法 如 ...

  3. 【代码周边】MongoDB与Mysql对比以及插入稳定性分析(指定主键的影响)

    在数据库存放的数据中,有一种特殊的键值叫做主键,它用于惟一地标识表中的某一条记录.也就是说,一个表不能有多个主键,并且主键不能为空值. 无论是MongoDB还是MySQL,都存在着主键的定义. 对于M ...

  4. ESP8288-01S/ESP8288-01使用经验总结

    如图:ESP8288-01S/ESP8288-01的区别 超链接 ESP8288-01S/ESP8288-01是乐鑫公司推出的Wi-Fi模块,因为价格便宜迅速占领了市场,它可以做AT指令开发,也可以做 ...

  5. .NET Core学习笔记(8)——Entity Framework Core之Database First

    曾经我以为再也不会去弄啥Database First,然鹅我错了.这个世界上就是有啪啪打脸和真香的时候.当小伙伴拿着做好的DB表结构和SQL脚本递过来的时候,我知道我没法拒绝.望着他突起的肱二头肌和充 ...

  6. 数据库分库分表容量划分建议参考阿里云DRDS原则

    做分库分表的时候 一直想知道分库分表容量的最优规则有什么好的建议,以下是参考阿里云 DRDS 分库分表的规则,还是有一定的参考意义 .

  7. lua脚本简介

    Lua [1]  是一个小巧的脚本语言.它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ier ...

  8. C++作用域限定符:private/public与protected

    C++的作用域限定符其实涉及到了C++特性中的封装和继承. public/private:涉及类的封装特性.对于一个类需要对外展示的部分,我们可以将其声明为public,对于不希望对外展示的,我们将其 ...

  9. MP(MyBatis-Plus)的自动填充功能

    什么是自动填充 有些表中会有更新时间.创建时间.更新人或者创建人这些字段. 每次对数据进行新增.删除.修改时都需要对这些字段进行设置.传统的做法是在进行这些操作前,对Entity的字段进行set设置, ...

  10. nacos服务注册与发现原理解析

    前言:nacos 玩过微服务的想必不会陌生,它是阿里对于springcloud孵化出来的产品,用来完成服务之间的注册发现和配置中心,其核心作用我就不废话了 大致流程:每个服务都会有一个nacos cl ...