题目大意:

求  1(m)到n直接有多少个数字x满足 x可以整出这个数字的每一位上的数字

思路:

整除每一位。只需要整除每一位的lcm即可

但是数字太大,dp状态怎么表示呢

发现 1~9的LCM 是2520 ....也就是说只要对这个数mod2520 剩下的余数能整除lcm就可以整除了。。

计数的时候还有一个技巧,具体见注释

此外这个题还卡常数了,预处理lcm才过了。。

代码如下:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define LCM 2520
long long dp[][LCM+][][];
long long n;
int m;
int state[],hs[],s;
bool vi[];
int d[];
int Lcm[][];
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
if(b==)
return a;
return a/gcd(a,b)*b;
} void ini()
{
m=;
while(n)
{
d[++m]=n%;
n/=;
}
reverse(d+,d+m+);
}
void DP()
{
memset(dp,,sizeof(dp));
//先放最高位
for(int i=;i<d[];i++)
{
dp[][i][hs[i]][]=; //dp...[0]存储的是前i位的数小于所求数的方案
}
dp[][d[]][hs[d[]]][]=; //dp...[1]存储的是前i位的数等于所求数的方案
//从高位往下转移
for(int i=;i<=m;++i)
{
for(int j=;j<;++j)
dp[i][j][hs[j]][]=; //从大于1的数位开始放1~9都肯定小于所求数
for(int j=;j<;++j)
{
for(int k=;k<s;++k)
{
if(dp[i-][j][k][]==&&dp[i-][j][k][]==)
continue;
for(int t=;t<=;++t)
{
int sum=(j*+t)%LCM;
int L=Lcm[k][t];
dp[i][sum][hs[L]][]+=dp[i-][j][k][]; //在当前位放的数小于等于所求数的当前为数的情况可以继承高位都等于所求数的方案
//否则,只能继承高位小于所求数的方案
if(t<d[i]) //当前位放的数小于所求数的当前位
{
dp[i][sum][hs[L]][]+=dp[i-][j][k][];
}
if(t==d[i]) //当前位放的数等于所求数的当前位
{
dp[i][sum][hs[L]][]+=dp[i-][j][k][];
} }
}
}
}
}
void setstate()
{
memset(vi,,sizeof(vi));
s=;
int tmp;
for(int i=;i<(<<);i++)
{
tmp=;
for(int j=;j<;j++)
{
if((<<j)&i)
{
tmp=lcm(j+,tmp);
}
}
if(vi[tmp]==)
{
state[s]=tmp;
hs[tmp]=s++;
vi[tmp]=;
}
}
for(int i=;i<s;i++)
{
for(int j=;j<=;j++)
Lcm[i][j]=lcm(state[i],j);
}
}
long long cal()
{
long long ans=; for(int i=;i<;i++)
{
for(int j=;j<s;j++)
{
if(i%state[j]==)
ans+=dp[m][i][j][]+dp[m][i][j][];
}
}
return ans;
}
long long solve(long long x)
{
n=x;
ini();
DP();
return cal();
}
int main()
{
long long a,b;
setstate();
int t;
scanf("%d",&t);
while(t--)
{
//scanf("%I64d%I64d",&a,&b);
scanf("%I64d",&a);
//cout<<solve(b)-solve(a-1)<<endl;
cout<<solve(a)<<endl;
}
return ;
}

FZU2179/Codeforces 55D beautiful number 数位DP的更多相关文章

  1. codeforces 55D - Beautiful numbers(数位DP+离散化)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  2. CodeForces - 55D - Beautiful numbers(数位DP,离散化)

    链接: https://vjudge.net/problem/CodeForces-55D 题意: Volodya is an odd boy and his taste is strange as ...

  3. Codeforces - 55D Beautiful numbers (数位dp+数论)

    题意:求[L,R](1<=L<=R<=9e18)区间中所有能被自己数位上的非零数整除的数的个数 分析:丛数据量可以分析出是用数位dp求解,区间个数可以转化为sum(R)-sum(L- ...

  4. CodeForces - 55D Beautiful numbers —— 数位DP

    题目链接:https://vjudge.net/problem/CodeForces-55D D. Beautiful numbers time limit per test 4 seconds me ...

  5. codeforces 55D. Beautiful numbers 数位dp

    题目链接 一个数, 他的所有位上的数都可以被这个数整除, 求出范围内满足条件的数的个数. dp[i][j][k], i表示第i位, j表示前几位的lcm是几, k表示这个数mod2520, 2520是 ...

  6. Codeforces 55D Beautiful Number

    Codeforces 55D Beautiful Number a positive integer number is beautiful if and only if it is divisibl ...

  7. beautiful number 数位DP codeforces 55D

    题目链接: http://codeforces.com/problemset/problem/55/D 数位DP 题目描述: 一个数能被它每位上的数字整除(0除外),那么它就是beautiful nu ...

  8. Codeforces 55D Beautiful Number (数位统计)

    把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容:  a positive integer number is beautiful if and only if it is  ...

  9. HDU 5179 beautiful number 数位dp

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

随机推荐

  1. CComPtr用法

    COM接口指针很危险,因为使用过程中需要每一个使用者都要严格并且正确的AddRef和Release,一旦出现问题,就会造成对象不能被正常释放,或者对象被重复删除,造成程序崩溃.所以使用COM接口,必须 ...

  2. 灵活性比Listview更好的RecycleView

    RecycleView:是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好. RecyclerView与ListView原理是类似的:都 ...

  3. 从零基础入门JavaScript(1)

    从零基础入门JavaScript(1) 1.1  Javascript的简史 1995年的时候   由网景公司开发的,当时的名字叫livescript    为了推广自己的livescript,搭了j ...

  4. php5.3.3安装mongo扩展

    /usr/bin/phpize./configure --with-php-config=/usr/bin/php-configmake && make install/usr/sbi ...

  5. ThinkPhp3.2 无法加载模块:Index

    http://localhost:444/admin/index.php/Index/index出错:无法加载模块:Index http://localhost:444/admin/index.php ...

  6. Sqlserver数据库日志太大如何快速删除

    sqlserver使用在windows系统中,如果文件超上百GB了,我们还直接删除不了,这个问题我以前的apache日志就碰到过,至今还没删除呢,那么Sqlserver数据库日志太大如何快速删除呢,有 ...

  7. C#垃圾回收

    析构方法: 我们知道引用类型都有构造方法(constructor),相对应的也有一个析构方法(destructor).顾名思义,构造方法,就是在创建这个对象时,要执行的方法.例如,我们可以通过构造方法 ...

  8. 武汉科技大学ACM:1005: Soapbear and Honey

    Problem Description Soapbear is the mascot of WHUACM team. Like other bears, Soapbear loves honey ve ...

  9. CentOS 7 之安装Mono&MonoDevelop

    之前在园子里看过一篇文章说的是在CentOS 7上安装MonoDevelop的,一直想照着弄一遍都没有弄,今天深圳外面下暴雨,就在家里弄一下这个吧,以后也试着在Linux上面写写C#玩玩.这一试,还真 ...

  10. SQL Server 中的SET XACT_ABORT各种用法及显示结果

      源地址:http://www.cnblogs.com/rob0121/articles/2320932.html 点击进入 默认行为:默认为SET XACT_ABORT OFF,没有事务行为. S ...