[AHOI2009]同类分布
题目大意:
问在区间[l,r]内的正整数中,有多少数能被其个位数字之和整除。
思路:
数位DP。
极端情况下,每一位都是9,所以各位数字之和不超过9*18。(为了方便这里用了9*19)
f[i][j][k][flag],表示DP到从左往右第i位时,各位数字之和为j,这个数字在模mod意义下为k。
flag表示是否为边界情况。
转移的时候枚举这一位上的数p。
设当前位是cur,则转移方程为:
f[i-1][j+p][(k*10+p)%mod][false]+=f[i][j][k][false];
f[i-1][j+p][(k*10+p)%mod][false]+=f[i][j][k][true];(p<cur)
f[i-1][j+p][(k*10+p)%mod][true]+=f[i][j][k][true];(p=cur)
观察发现f的第1维只会同时用到两层,所以可以滚动数组。
#include<cstdio>
#include<cctype>
#include<cstring>
typedef unsigned long long qword;
inline qword getint() {
register char ch;
while(!isdigit(ch=getchar()));
register qword x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const qword pow[]={1ull,10ull,100ull,1000ull,10000ull,100000ull,1000000ull,10000000ull,100000000ull,1000000000ull,10000000000ull,100000000000ull,1000000000000ull,10000000000000ull,100000000000000ull,1000000000000000ull,10000000000000000ull,100000000000000000ull,1000000000000000000ull,10000000000000000000ull};
const int SUM=*;
qword f[][SUM+][SUM][];
inline qword calc(const qword &n) {
const int len=__builtin_log10(n)+;
qword ret=;
for(register int mod=;mod<=*len;mod++) {
memset(f[len&],,sizeof f[len&]);
f[len&][][][true]=;
for(register int i=len;i;i--) {
memset(f[!(i&)],,sizeof f[!(i&)]);
const int cur=n%pow[i]/pow[i-];
for(register int j=;j<=mod;j++) {
for(register int k=;k<mod;k++) {
for(register int p=;p<;p++) {
if(j+p>mod) break;
f[!(i&)][j+p][((((k<<)+k)<<)+p)%mod][false]+=f[i&][j][k][false];
if(p<cur) f[!(i&)][j+p][((((k<<)+k)<<)+p)%mod][false]+=f[i&][j][k][true];
if(p==cur) f[!(i&)][j+p][((((k<<)+k)<<)+p)%mod][true]+=f[i&][j][k][true];
}
}
}
}
ret+=f[][mod][][false]+f[][mod][][true];
}
return ret;
}
int main() {
const qword l=getint(),r=getint();
printf("%llu\n",calc(r)-calc(l-));
return ;
}
[AHOI2009]同类分布的更多相关文章
- 【BZOJ1799】[AHOI2009]同类分布(动态规划)
[BZOJ1799][AHOI2009]同类分布(动态规划) 题面 BZOJ 洛谷 题解 很容易想到数位\(dp\),然而数字和整除原数似乎不好记录.没关系,直接枚举数字和就好了,这样子就可以把整除原 ...
- 洛谷 P4127 [AHOI2009]同类分布 解题报告
P4127 [AHOI2009]同类分布 题目描述 给出两个数\(a,b\),求出\([a,b]\)中各位数字之和能整除原数的数的个数. 说明 对于所有的数据,\(1 ≤ a ≤ b ≤ 10^{18 ...
- P4127 [AHOI2009]同类分布
P4127 [AHOI2009]同类分布 题解 好的,敲上数位DP DFS板子 记录一下填的各位数字之和 sum ,然后记录一下原数 yuan 最后判断一下 yuan%sum==0 不就好啦??? ...
- [BZOJ1799][AHOI2009]同类分布(数位DP)
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MBSubmit: 1635 Solved: 728[Submit][S ...
- 【[AHOI2009]同类分布】
这是一篇有些赖皮的题解 (如果不赖皮的话,bzoj上也是能卡过去的) 首先由于我这个非常\(sb\)的方法复杂度高达\(O(171^4)\),所以面对极限的\(1e18\)的数据实在是卡死了 但是这个 ...
- 【题解】AHOI2009同类分布
好开心呀~果然只有不看题解做出来的题目才会真正的有一种骄傲与满足吧ヾ(๑╹◡╹)ノ" 实际上这题只要顺藤摸瓜就可以了.首先按照数位dp的套路,有两维想必是省不掉:1.当前dp到到的位数:2. ...
- [luogu4127 AHOI2009] 同类分布 (数位dp)
传送门 Solution 裸数位dp,空间存不下只能枚举数字具体是什么 注意memset最好为-1,不要是0,有很多状态答案为0 Code //By Menteur_Hxy #include < ...
- 洛谷 P4127 [AHOI2009]同类分布
题意简述 求l~r之间各位数字之和能整除原数的数的个数. 题解思路 数位DP 代码 #include <cstdio> #include <cstring> typedef l ...
- 【数位DP】【P4127】[AHOI2009]同类分布
Description 给出两个数 \(a,~b\) 求出 \([a~,b]\) 中各位数字之和能整除原数的数的个数. Limitations \(1 \leq a,~b \leq 10^{18}\) ...
随机推荐
- 4163 hzwer与逆序对 (codevs + 权值线段树 + 求逆序对)
题目链接:http://codevs.cn/problem/4163/ 题目:
- 用CRF做命名实体识别(一)
用CRF做命名实体识别(二) 用CRF做命名实体识别(三) 用BILSTM-CRF做命名实体识别 博客园的markdown格式可能不太方便看,也欢迎大家去我的简书里看 摘要 本文主要讲述了关于人民日报 ...
- Nginx部署部分https与部分http【转】
转自 Nginx部署部分https与部分http - na_tion的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/na_tion/article/details/ ...
- react native系列 - 从零开始构建
从零开始构建第一步,当然是从hello world开始,第一课我们没什么代码都不写,只用生成的代码来打包apk.为什么一开始就要学会打包,因为如果连打包都不会,以后做好了也没用.学会了打包,才能让我们 ...
- c++环境配置 Eclipse+mingw-get-setup
1,到官网下载eclipse 和 mingw-get-setup 2,先安装eclipse,然后等着... 3,再安装mingw-get-setup, 等待...安装完成后打开,选择basic s ...
- 问题解决:The content of the adapter has changed but ListView did not receive a notification
1. 不要在后台线程中直接调用adapter 2. 不要在后台线程中修改adapter绑定的数据 如果对adapter或者adapter绑定的数据是在线程中,加上runOnUiThread就可以了 r ...
- selenium滚动到顶部与底部
#coding=utf-8 from selenium import webdriver #滚动到浏览器顶部 js_top = "var q=document.documentElement ...
- Kaggle:Titanic: Machine Learning from Disaster
一直想着抓取股票的变化,偶然的机会在看股票数据抓取的博客看到了kaggle,然后看了看里面的题,感觉挺新颖的,就试了试. 题目如图:给了一个train.csv,现在预测test.csv里面的Passa ...
- function(函数)中的动态参数
我们可向函数传递动态参数,*args,**kwargs,首先我们来看*args,示例如下: 1.show(*args) def show(*args): print(args,type(arg ...
- HTK训练错误消息意义
在HTK训练线上数据的时候,遇到了ERROR [+6550] LoadHTKLabels: Junk at end of HTK transcription,这个问题,网上查阅是说有空行,结果根本没有 ...