Codeforces 55 D. Beautiful numbers

题目链接:http://codeforces.com/problemset/problem/55/D



很裸的数位$DP$但是要考虑一下如何设计状态保证复杂度且不会爆掉空间...

提供一种很暴力的状态表示

${f[len][zt][res]}$表示从高位往地位确定到了第$len$位,是否选取了${2..9}$这些数字状压为$zt$(因为${0,1}$不影响判定),数字模$2520$的值为$res$的数字有多少个。

${gcd(2,3,4,5,6,7,8,9)=2520}$

然后记忆化一下就可以了,


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 10010
10 #define llg int
11 #define SIZE (1<<8)
12 #define LL long long
13 #define md 2520
14 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
15 llg n,m,c[100],T;
16 llg p[8]={2,3,4,5,6,7,8,9};
17 LL f[20][SIZE+1][2520];
18
19 inline llg getint()
20 {
21        llg w=0,q=0; char c=getchar();
22        while((c<‘0‘ || c>‘9‘) && c!=‘-‘) c=getchar(); if(c==‘-‘) q=1,c=getchar();
23        while (c>=‘0‘ && c<=‘9‘) w=w*10+c-‘0‘, c=getchar(); return q ? -w : w;
24 }
25
26 LL dfs(llg len,llg zt,llg res,bool flag)
27 {
28     if (!len)
29     {
30         for (llg i=0;i<8;i++)
31             if (zt&(1<<i) && res%(i+2)!=0)
32                 return 0;
33         return 1;
34     }
35     if (!flag && f[len][zt][res]!=-1) return f[len][zt][res];
36     llg up;
37     LL sum=0;
38     if (flag) up=c[len];else up=9;
39     for (llg i=0;i<=up;i++)
40     {
41         llg nezt,neres;
42         if (i>1) nezt=zt|(1<<(i-2)); else nezt=zt;
43         neres=(res*10+i)%md;
44         sum+=dfs(len-1,nezt,neres,(flag && i==up));
45     }
46     if (!flag) f[len][zt][res]=sum;
47     return sum;
48 }
49
50 LL dp(LL x)
51 {
52     if (x==0) return 1;
53     llg wei=0;
54     while (x)
55     {
56         c[++wei]=x%10;
57         x/=10;
58     }
59     return dfs(wei,0,0,1);
60 }
61
62 int main()
63 {
64     //yyj("number");
65     cin>>T;
66     LL a,b;
67     memset(f,-1,sizeof(f));
68     while (T--)
69     {
70         scanf("%lld%lld",&a,&b);
71              printf("%lld\n",dp(b)-dp(a-1));
72     }
73     return 0;
74 }
时间: 2024-10-08 08:02:28

Codeforces 55 D. Beautiful numbers的相关文章

codeforces 55D D. Beautiful numbers(数位dp+数论)

题目链接: codeforces 55D 题目大意: 求在[l,r]中能够整除自己每个数位上的数字的数的个数. 题目分析: 首先我们能够知道如果这个数能够整除它的每个数位上的数字,那么它一定能够整除他们的最小公倍数,是充要的. 那么我们定义状态dp[i][j][k]代表i位在任意组合下得到的所有数位的数字的最小公倍数为j的每个数位上的数字之积%2520为k的方案数. 我们可以知道所有的公倍数最大不会超过2520,而且他们都是2520的约数,所以如果他们能够整除2520的余数,那么证明他们能够整除

CF D. Beautiful numbers (数位dp)

http://codeforces.com/problemset/problem/55/D Beautiful Numbers : 这个数能整除它的全部位上非零整数.问[l,r]之间的Beautiful Numbers的个数. 若一个数能整除它的全部的非零数位.那么相当于它能整除个位数的最小公倍数. 因此记忆化搜索中的參数除了len(当前位)和up(是否达到上界),有一个prelcm表示前面的数的最小公倍数.推断这个数是否是Beautiful Numbers,还要有一个參数表示前面数,可是这个数

codeforces Beautiful Numbers

来源:http://codeforces.com/problemset/problem/1265/B B. Beautiful Numbers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a permutation p=[p1,p2,…,pn]p=[p1,p2,…,pn] of integers

CodeForces 55D Beautiful numbers 数位DP+数学

题意大概是,判断一个正整数区间内有多少个整数能被它自身的每一个非零的数字整除. 因为每一个位置上的整数集s = {0,1,2,3,4,5,6,7,8,9} lcm(s) = 2520 现在有一个整数t是由s中一个或者多个数字构成的,记为abcde,显然t = a*10^4+b*10^3+c*10^2+d*10^1+e 要使得t能被a,b,c,d,e整除,必然有t % lcm(a,b,c,d,e) = 0 因为a,b,c,d,e去重之后一定是s的一个子集,所以lcm(s)一定是lcm(a,b,c,

Codeforces 55D. Beautiful numbers(数位DP,离散化)

Codeforces 55D. Beautiful numbers 题意 求[L,R]区间内有多少个数满足:该数能被其每一位数字都整除(如12,24,15等). 思路 一开始以为是数位DP的水题,觉得只需要记录搜到当前位出现了哪些数字作为状态即可,明显是假算法...感觉这是一道数位DP好题.可以这样思考:一个数要想被其各位数字分别都整除,等价于它被那些数字的LCM整除.因此记录当前位,当前数对(1~9的LCM)取模的结果,当前出现的数字的LCM这三个值作为状态才合理,即dp[pos][sum][

Codeforces Beta Round #51---D. Beautiful numbers(数位dp, 巧妙)

Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer number is beautiful if and only if it is divisible by each of its nonzero digits. We will not argue with this and just count the quantity of beautiful num

CodeForces 55D Beautiful numbers(数位dp&amp;&amp;离散化)

题目链接:[kuangbin带你飞]专题十五 数位DP A - Beautiful numbers 题意 ps:第一道数位dp,题真好,虽然是参考大牛方法悟过才a,但仍收获不少. 求一个区间内的Beautiful numbers有多少个.Beautiful numbers指:一个数能整除所有组成它的非0数字. 例如15可以被1和5整除,所以15是Beautiful numbers. 思路 Beautiful numbers指:一个数能整除所有组成它的非0数字. 等同于 一个数能整除 所有组成它的

CodeForces 55D Beautiful numbers

Beautiful numbers 题目链接 Description Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer number is beautiful if and only if it is divisible by each of its nonzero digits. We will not argue with this and just

CodeForces 300C Beautiful Numbers(乘法逆元/费马小定理+组合数公式+快速幂)

C. Beautiful Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Vitaly is a very weird man. He's got two favorite digits a and b. Vitaly calls a positive integer good, if the decimal