[BZOJ 1799] self 同类分布
Link:
Solution:
一句话的题目,看得爽,做得烦
一般这类和数位相关的都是数位$dp$吧
不过一开始还是感觉不太可做,毕竟每个数模数不同
但要发现,模数最高也只可能为$9*19=171$,
于是只要将数按照他们的数位和(即模数)分类计算即可
这样便暴力解决了模数不同的问题
设$dp[sp][sum][rmd][lmt]$表示:
枚举到第$sp$高位,剩下的数的和位$sum$,此时对$mod$余$rmd$时的方案数(lmt表示是否达到上界)
感觉数位$dp$还是用记忆化搜索写起来逻辑比较清晰吧
Code:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MAXN=; //n可能为19,sum最大为171
int vis[][MAXN][MAXN][],mod,dgt,cur,num[];
ll a,b,dp[][MAXN][MAXN][]; ll dfs(int sp,int sum,int rmd,int lmt)
{
if(!sp) return !sum && !rmd;
if(vis[sp][sum][rmd][lmt]==cur) return dp[sp][sum][rmd][lmt];
vis[sp][sum][rmd][lmt]=cur;ll ret=; int l=max(,sum-(sp-)*),r=min((lmt)?num[sp]:,sum);
for(int i=l;i<=r;i++)
ret+=dfs(sp-,sum-i,(rmd*+i)%mod,lmt&(i==num[sp]));
return dp[sp][sum][rmd][lmt]=ret;
} ll solve(ll x)
{
ll ret=;
for(dgt=;x;x/=) num[++dgt]=x%;
for(mod=;mod<=dgt*;mod++)
cur++,ret+=dfs(dgt,mod,,);
return ret;
} int main()
{
scanf("%lld%lld",&a,&b);
printf("%lld\n",solve(b)-solve(a-));
return ;
}
Review:
1、少用$memset$,尽量在使用时顺便初始化
为了区分不同次的调用,可以在每一次调用打上不同的标记
2、在$dp$时难以处理模数不同的情况
考虑将数据分类后直接暴力所有可能的模数
3、$1e18$可能有19位,$MAXN$要设为175
(一开始扫了一眼题解上$MAXN$为165,以后还是要自己算啊……)
[BZOJ 1799] self 同类分布的更多相关文章
- HYSBZ - 1799 self 同类分布
self 同类分布 HYSBZ - 1799 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.Sample Input 10 19 Sample Output 3 Hint [约束条件] ...
- bzoj 1799: [Ahoi2009]self 同类分布 数位dp
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Descripti ...
- bzoj 1799: [Ahoi2009]self 类似的分布 解读
[原标题] 1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MB Submit: 554 Solved: 194 [id ...
- 【BZOJ1799】[AHOI2009]同类分布(动态规划)
[BZOJ1799][AHOI2009]同类分布(动态规划) 题面 BZOJ 洛谷 题解 很容易想到数位\(dp\),然而数字和整除原数似乎不好记录.没关系,直接枚举数字和就好了,这样子就可以把整除原 ...
- [BZOJ1799][AHOI2009]同类分布(数位DP)
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MBSubmit: 1635 Solved: 728[Submit][S ...
- [Ahoi2009]self 同类分布
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MBSubmit: 2357 Solved: 1079[Submit][ ...
- BZOJ1799 self 同类分布 数位dp
BZOJ1799self 同类分布 去博客园看该题解 题意 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. [约束条件]1 ≤ a ≤ b ≤ 10^18 题解 1.所有的位数之和&l ...
- 洛谷 P4127 [AHOI2009]同类分布 解题报告
P4127 [AHOI2009]同类分布 题目描述 给出两个数\(a,b\),求出\([a,b]\)中各位数字之和能整除原数的数的个数. 说明 对于所有的数据,\(1 ≤ a ≤ b ≤ 10^{18 ...
- P4127 [AHOI2009]同类分布
P4127 [AHOI2009]同类分布 题解 好的,敲上数位DP DFS板子 记录一下填的各位数字之和 sum ,然后记录一下原数 yuan 最后判断一下 yuan%sum==0 不就好啦??? ...
随机推荐
- 【POJ 1201 Intervals】
Time Limit: 2000MSMeamory Limit: 65536K Total Submissions: 27949Accepted: 10764 Description You are ...
- POJ2195:Going Home (最小费用最大流)
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26212 Accepted: 13136 题目链接 ...
- POJ 2398 Toy Storage 二分+叉积
Description Mom and dad have a problem: their child, Reza, never puts his toys away when he is finis ...
- hadoop删除节点和添加节点
从hadoop移除机器把需要移除的机器增加到exclueds文件中,强制刷新datanode列表,等待decommission 状态正常后,即可停机下架,如有必要在namenode执行balancer ...
- Docker Community Edition for CentOS
Docker CE for CentOS Docker CE for CentOS distribution is the best way to install the Docker platfor ...
- ES6学习笔记(五)—— 编程风格
1. 块级作用域 let 取代 var —— let 只在声明的代码块内有效,而且不存在变量提升的效用 const 取代 let —— const 比较符合函数式编程的思想,运算不改变值,只是新建值: ...
- sencha touch 模仿tabpanel导航栏TabBar的实现代码
这篇文章介绍了sencha touch 模仿tabpanel导航栏TabBar的实例代码,有需要的朋友可以参考一下 基于sencha touch 2.2所写 效果图: 代码: /* *模仿tabpan ...
- centos7装机时更改网卡名为eth0操作
- ZOJ1450 Minimal Circle
You are to write a program to find a circle which covers a set of points and has the minimal area. T ...
- 【洛谷 P1651】 塔 (差值DP)
题目链接 题意:\(n\)个木块放到两个塔里,每个木块可放可不放,使得两塔高度相同且高度最大,求最大高度. 这个差值\(DP\)的思维难度还是很大的,没想出来,我就打了一个\(dfs\)骗了好像\(2 ...