题意:求小于等于N且能被自己所有位上数之和整除的数的个数。

分析:裸的数位dp。用一个三位数组dp[i][j][k]记录:第i位,之前数位之和为j,对某个mod余数为k的状态下满足条件的个数。这里mod的值就是小于等于N的数中,所有可能出现的数位之和。所以solve函数中需要对dfs函数做一个循环,上限是9*pos(数位之和不会超过9*pos)。

还有需要注意的是,在递归的时候可以通过判断当前数位之和sum是否超过mod,超过的话肯定在这个状态下没有满足条件的数,以此剪枝优化。

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
const int INF =0x3f3f3f3f;
typedef long long LL;
int a[20];
LL dp[13][105][150];        //dp[i][j][k]记录 第i位,前面数位之和为j,对某个mod的余数是k的状态下满足条件的个数
int mod;LL dfs(int pos,int sum,int remain,bool limit){if(pos==-1) return (sum==mod && !remain);if(dp[pos][sum][remain]!=-1 && !limit) return dp[pos][sum][remain];int up = limit? a[pos]:9;LL res=0;for(int i=0;i<=up;++i){if(i+sum>mod) break;            //剪枝res+=dfs(pos-1,sum+i,(remain*10+i)%mod,limit && i==a[pos]);}if(!limit) dp[pos][sum][remain] = res;return res;
}LL solve(LL N)
{int pos=0;LL x=N;while(x){a[pos++]=x%10;x/=10;}LL res=0;for(int i=1;i<=9*pos;++i){mod=i;                          memset(dp,-1,sizeof(dp));       //这里的dp数组记录的只是针对一种模数的状态,所以每次都要清空res+=dfs(pos-1,0,0,true);}return res;
}int main(){int T,M,num,t,x;LL N;#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifwhile(scanf("%lld",&N)==1){printf("%lld\n",solve(N));}return 0;
}

转载于:https://www.cnblogs.com/xiuwenli/p/9383809.html

The 2018 ACM-ICPC上海大都会赛 J Beautiful Numbers (数位DP)相关推荐

  1. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  2. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers

    传送门 题意:问你从[1,N]有多少个数能被自身的SOD(sum of digits)整除 题解:数位dp,枚举SOD,因为最多只有12位,所以只要枚举1到12*9,一维记录pos,二维记录当前剩余要 ...

  3. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  4. 2013 ACM/ICPC 长沙网络赛J题

    题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...

  5. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it

    链接:https://www.nowcoder.com/acm/contest/163/F 来源:牛客网 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it 时间限制:C ...

  6. 解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  7. 2019年安徽大学ACM/ICPC实验室新生赛题解

    本文仅作个人收藏学习使用 题目及解析来源牛客竞赛网 //作者:王清楚 //链接:https://ac.nowcoder.com/discuss/351408?type=101&order=0& ...

  8. 2019 ICPC 徐州网络赛 J.Random Access Iterator

    2019 ICPC 徐州网络赛 J.Random Access Iterator 题目大意:给你n个点和n-1条边(树形结构),保证1为根节点,通过以下方式dfs遍历: 询问dfs到最深节点的概率(有 ...

  9. 2018年 ACM/ICPC亚洲区域赛 青岛赛区现场赛 比赛总结

    首先祝贺自己收获了ACM生涯中的第二枚铜牌. 首先吐槽一下中石油: 周六早上来到中国石油大学,连个志愿者小姐姐都没看到.(但是看到了女装大佬).报完到之后发现教练少了一张午餐券(要不要这么粗心).为了 ...

最新文章

  1. 皮一皮:原来微信备注还有这个用...
  2. 25 个超棒的 WordPress 主题(2012)
  3. redis 内存不足 排查_一文深入了解 Redis 内存模型,Redis 的快是有原因的!
  4. 数学中不可能实现的图形
  5. 软件质量的理解 摘录
  6. 深度学习为图片人物换装【python代码教程】
  7. Java—重入锁的理解
  8. PhpYun人才系统 整合 Ucenter 之后,会员注册提示”该 Email 已经被注册!“的解决方案
  9. Spark学习-SparkSQL--04-SparkSQL CLI 单节点运行与yarn集群运行
  10. mysql缓存怎么防止缓存击穿_带你搞明白什么是缓存穿透、缓存击穿、缓存雪崩...
  11. Firefox附加在合谋表演,谁跟踪你上网
  12. iOS之Cocoapods安装
  13. 全宁对医药行业销售代表的介绍
  14. Boost升压电路调试
  15. plc c语言做报警,wincc声音报警C脚本版
  16. python的metaclass分析
  17. 【日语】日语动词的敬体与简体
  18. AD21 DXP 快捷键失效的解决办法
  19. linux获取cpu使用率,linux获取cpu使用率
  20. 矢量网络分析仪测试射频线线损的注意事项

热门文章

  1. python安装django模块_python中安装django模块的方法
  2. u盘无法复制文件进去_只需一招,禁止Windows复制文件到U盘,再也不用担心你的资料被拷走!...
  3. HTML 禁止数字因被自动识别为手机号,而被添加拨号链接样式
  4. vue之watch用法
  5. Codeforces 552C Vanya and Scales(进制转换+思维)
  6. 3.3、自定义错误页面
  7. 最全面的Android Studio使用教程【申明:来源于网络】
  8. 军训分批(codevs 2751)
  9. 酒厂选址(codevs 1507)
  10. 为什么到今天还要坚持写博客(转)