CodeForces 55D Beautiful numbers(数位dp+数学)
题目链接:http://codeforces.com/problemset/problem/55/D
题意:一个美丽数就是可以被它的每一位的数字整除的数。
给定一个区间,求美丽数的个数。
显然这是一道数位dp,就是满足一个数能被所有位数的lcm整除即可。
一般都会设dp[len][mod][LCM],mod表示余数,LCM表示前len位的lcm。
但是如果直接裸mod会很复杂,于是再想lcm{0,1,2,3,4,5,6,7,8,9}=2520;
而且lcm{a,b,c,d....}{a,b,c,d...表示各个位数)去重之后能被lcm{0,1,2....9}
整除。我们要求的是sum%lcm(a,b,c,d..}==0,所以只要满足
sum%lcm(0,1,2,...9}%lcm(a,b,c,d..}==0即可。于是mod就可以表示为
sum%lcm(0,1,2,...9}为多少。但是mod<=2520 && LCM<=2520这样
肯定存不下,于是要考虑如何处理LCM,毕竟很明显0~9的最大公倍数种类不会
超过48个。于是可以考虑一下离散化一下LCM,
if 2520 % num == 0 -> LCM[num]=temp++;
这样dp的三维就可以设为dp[20][2520][48];
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
typedef long long ll;
const int mmax = 2520;
ll n , m , dp[20][mmax][50];
int temp , dig[20] , LCM[mmax + 10];
ll gcd(ll a , ll b) {
return b > 0 ? gcd(b , a % b) : a;
}
ll lcm(ll a , ll b) {
return a / gcd(a , b) * b;
}
void init() {
temp = 0;
for(int i = 1 ; i <= mmax ; i++) {
if(mmax % i == 0) {
LCM[i] = temp++;
}
else {
LCM[i] = 0;
}
}
}
ll dfs(int len , int count , int mod , int flag) {
if(!len) {
return mod % count == 0;
}
if(!flag && dp[len][mod][LCM[count]] != -1) {
return dp[len][mod][LCM[count]];
}
int t = flag ? dig[len] : 9;
ll sum = 0;
for(int i = 0 ; i <= t ; i++) {
int Nextmod = (mod * 10 + i) % mmax;
int Nextcount;
if(i == 0) {
Nextcount = count;
}
else {
Nextcount = (int)lcm(count , i);
}
sum += dfs(len - 1 , Nextcount , Nextmod , flag && i == t);
}
if(!flag)
dp[len][mod][LCM[count]] = sum;
return sum;
}
ll Gets(ll x) {
memset(dig , 0 , sizeof(dig));
int len = 0;
if(x == 0) {
dig[++len] = 0;
}
while(x) {
dig[++len] = x % 10;
x /= 10;
}
return dfs(len , 1 , 0 , 1);
}
int main() {
int t;
scanf("%d" , &t);
init();
memset(dp , -1 , sizeof(dp));
while(t--) {
scanf("%I64d%I64d" , &n , &m);
printf("%I64d\n" , Gets(m) - Gets(n - 1));
}
return 0;
}
CodeForces 55D Beautiful numbers(数位dp+数学)的更多相关文章
- codeforces 55D - Beautiful numbers(数位DP+离散化)
D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- CodeForces - 55D - Beautiful numbers(数位DP,离散化)
链接: https://vjudge.net/problem/CodeForces-55D 题意: Volodya is an odd boy and his taste is strange as ...
- CodeForces - 55D Beautiful numbers —— 数位DP
题目链接:https://vjudge.net/problem/CodeForces-55D D. Beautiful numbers time limit per test 4 seconds me ...
- Codeforces - 55D Beautiful numbers (数位dp+数论)
题意:求[L,R](1<=L<=R<=9e18)区间中所有能被自己数位上的非零数整除的数的个数 分析:丛数据量可以分析出是用数位dp求解,区间个数可以转化为sum(R)-sum(L- ...
- codeforces 55D. Beautiful numbers 数位dp
题目链接 一个数, 他的所有位上的数都可以被这个数整除, 求出范围内满足条件的数的个数. dp[i][j][k], i表示第i位, j表示前几位的lcm是几, k表示这个数mod2520, 2520是 ...
- FZU2179/Codeforces 55D beautiful number 数位DP
题目大意: 求 1(m)到n直接有多少个数字x满足 x可以整出这个数字的每一位上的数字 思路: 整除每一位.只需要整除每一位的lcm即可 但是数字太大,dp状态怎么表示呢 发现 1~9的LCM 是2 ...
- CF 55D. Beautiful numbers(数位DP)
题目链接 这题,没想出来,根本没想到用最小公倍数来更新,一直想状态压缩,不过余数什么的根本存不下,看的von学长的blog,比着写了写,就是模版改改,不过状态转移构造不出,怎么着,都做不出来. #in ...
- CodeForces 55D "Beautiful numbers"(数位DP+离散化处理)
传送门 参考资料: [1]:CodeForces 55D Beautiful numbers(数位dp&&离散化) 我的理解: 起初,我先定义一个三维数组 dp[ i ][ j ][ ...
- Codeforces 55D. Beautiful numbers(数位DP,离散化)
Codeforces 55D. Beautiful numbers 题意 求[L,R]区间内有多少个数满足:该数能被其每一位数字都整除(如12,24,15等). 思路 一开始以为是数位DP的水题,觉得 ...
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP)
2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ...
随机推荐
- Core CLR Host 源码简单分析
在定制 CLR Host的时候,可以通过调用如下代码,来获取当前需要被宿主的程序调用入口: hr = Host->CreateDelegate( domainId, L"Main,Ve ...
- 证明线程池ThreadPoolExecutor的核心线程数,最大线程数,队列长度的关系
关于线程池的几个参数,很多人不是很清楚如何配置,他们之间是什么关系,我用代码来证明一下. package www.itbac.com; import java.util.concurrent.*; p ...
- java并发编程(二)----创建并运行java线程
实现线程的两种方式 上一节我们了解了关于线程的一些基本知识,下面我们正式进入多线程的实现环节.实现线程常用的有两种方式,一种是继承Thread类,一种是实现Runnable接口.当然还有第三种方式,那 ...
- 转载 | CSS图片下面产生间隙的 6种解决方案
在进行页面的DIV+CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的对於 该问题的解决方法也是「见机行事」,根据原因的不同要用不同的 ...
- js学习之数据类型
js学习之数据类型 基础类型:number string boolean null undefined 引用类型:object array function undefined值是派生自null值的( ...
- 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式
1.概述 通过上篇史上最全面的SignalR系列教程-1.认识SignalR文章的介绍,我们对SignalR技术已经有了一个全面的了解.本篇开始就通过SignalR的典型应用的实现方式做介绍,例子虽然 ...
- SoapSerialization——手机号码归属地
public class MainActivity extends AppCompatActivity { private EditText etNumber; private TextView tv ...
- python random 模块及验证码功能
random模块 import random random.random() random.randint(1,3) # 1-3的整数包括3 import random print(random.ra ...
- 送礼物「JSOI 2015」RMQ+01分数规划
[题目描述] 礼品店一共有N件礼物排成一列,每件礼物都有它的美观度.排在第\(i(1\leq i\leq N)\)个位置的礼物美观度为正整数\(A_I\).JYY决定选出其中连续的一段,即编号为礼物\ ...
- XML简单了解一下
XML是一种纯文本文档.HTML,标记是已经被W3C规定好的,自己创建一个标签是不被允许的. XML现在的用途是用来存储数据.config文件就是个XML文档.XML是可以自定义的. 每一个XML文档 ...