The 2018 ACM-ICPC上海大都会赛 J Beautiful Numbers (数位DP)
题意:求小于等于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)相关推荐
- 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers
传送门 题意:问你从[1,N]有多少个数能被自身的SOD(sum of digits)整除 题解:数位dp,枚举SOD,因为最多只有12位,所以只要枚举1到12*9,一维记录pos,二维记录当前剩余要 ...
- 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 ...
- 2013 ACM/ICPC 长沙网络赛J题
题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it
链接:https://www.nowcoder.com/acm/contest/163/F 来源:牛客网 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it 时间限制:C ...
- 解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 2019年安徽大学ACM/ICPC实验室新生赛题解
本文仅作个人收藏学习使用 题目及解析来源牛客竞赛网 //作者:王清楚 //链接:https://ac.nowcoder.com/discuss/351408?type=101&order=0& ...
- 2019 ICPC 徐州网络赛 J.Random Access Iterator
2019 ICPC 徐州网络赛 J.Random Access Iterator 题目大意:给你n个点和n-1条边(树形结构),保证1为根节点,通过以下方式dfs遍历: 询问dfs到最深节点的概率(有 ...
- 2018年 ACM/ICPC亚洲区域赛 青岛赛区现场赛 比赛总结
首先祝贺自己收获了ACM生涯中的第二枚铜牌. 首先吐槽一下中石油: 周六早上来到中国石油大学,连个志愿者小姐姐都没看到.(但是看到了女装大佬).报完到之后发现教练少了一张午餐券(要不要这么粗心).为了 ...
最新文章
- 皮一皮:原来微信备注还有这个用...
- 25 个超棒的 WordPress 主题(2012)
- redis 内存不足 排查_一文深入了解 Redis 内存模型,Redis 的快是有原因的!
- 数学中不可能实现的图形
- 软件质量的理解 摘录
- 深度学习为图片人物换装【python代码教程】
- Java—重入锁的理解
- PhpYun人才系统 整合 Ucenter 之后,会员注册提示”该 Email 已经被注册!“的解决方案
- Spark学习-SparkSQL--04-SparkSQL CLI 单节点运行与yarn集群运行
- mysql缓存怎么防止缓存击穿_带你搞明白什么是缓存穿透、缓存击穿、缓存雪崩...
- Firefox附加在合谋表演,谁跟踪你上网
- iOS之Cocoapods安装
- 全宁对医药行业销售代表的介绍
- Boost升压电路调试
- plc c语言做报警,wincc声音报警C脚本版
- python的metaclass分析
- 【日语】日语动词的敬体与简体
- AD21 DXP 快捷键失效的解决办法
- linux获取cpu使用率,linux获取cpu使用率
- 矢量网络分析仪测试射频线线损的注意事项
热门文章
- python安装django模块_python中安装django模块的方法
- u盘无法复制文件进去_只需一招,禁止Windows复制文件到U盘,再也不用担心你的资料被拷走!...
- HTML 禁止数字因被自动识别为手机号,而被添加拨号链接样式
- vue之watch用法
- Codeforces 552C Vanya and Scales(进制转换+思维)
- 3.3、自定义错误页面
- 最全面的Android Studio使用教程【申明:来源于网络】
- 军训分批(codevs 2751)
- 酒厂选址(codevs 1507)
- 为什么到今天还要坚持写博客(转)