FZU2179/Codeforces 55D beautiful number 数位DP
题目大意:
求 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的更多相关文章
- 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+数论)
题意:求[L,R](1<=L<=R<=9e18)区间中所有能被自己数位上的非零数整除的数的个数 分析:丛数据量可以分析出是用数位dp求解,区间个数可以转化为sum(R)-sum(L- ...
- 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
题目链接 一个数, 他的所有位上的数都可以被这个数整除, 求出范围内满足条件的数的个数. dp[i][j][k], i表示第i位, j表示前几位的lcm是几, k表示这个数mod2520, 2520是 ...
- Codeforces 55D Beautiful Number
Codeforces 55D Beautiful Number a positive integer number is beautiful if and only if it is divisibl ...
- beautiful number 数位DP codeforces 55D
题目链接: http://codeforces.com/problemset/problem/55/D 数位DP 题目描述: 一个数能被它每位上的数字整除(0除外),那么它就是beautiful nu ...
- Codeforces 55D Beautiful Number (数位统计)
把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容: a positive integer number is beautiful if and only if it is ...
- HDU 5179 beautiful number 数位dp
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...
随机推荐
- android 使用String.format("%.2f",67.876)自已定义语言(俄语、西班牙语)会把小数点变为逗号
市场人员反映公司的app使用系统设置俄语.西班牙语,double数据会把小数点变为逗号.调试一下,是自定义的语言时候(例如,俄语.西班牙语)转换String.format("%.2f&quo ...
- sass笔记-3|Sass基础语法之样式复用和保持简洁
上一篇详述了Sass如何嵌套.导入和注释这3个基本方式来保持条理性和可读性,这一篇更进一步地阐述sass保持样式复用和简洁的方式--混合器和选择器继承--这两种方式都能复用样式,使用它们也不难,但一定 ...
- sql server 性能计数器
常规计数器 收集操作系统服务器的服务器性能信息,包括Processor.磁盘.网络.内存 Processor 处理器 1.1 % Processor Time指处理器用来执行非闲置线程时间的百分比.通 ...
- 读取文件内容返回List<String>类型
文件内容格式: string1 string2 String 3 …… 很简单,两句话 String content = new String(Files.readAllBytes(Paths.get ...
- Windows Server 2008 R2 搭建FTP服务
一.安装ftp服务 1.在服务管理器"角色"右键单击"添加角色". 2.下一步. 3.勾选"Web 服务器(IIS)",下一步. 4.勾选 ...
- requirejs和r.js的心得
requirejs的GitHub:requirejs r.js的GitHub:r.js grunt-contrib-requirejs的GitHub:grunt-contrib-requirejs r ...
- nosqlunit开源框架
import com.lordofthejars.nosqlunit.annotation.UsingDataSet;import com.lordofthejars.nosqlunit.core.L ...
- linux的sudo apt-get install 和dpkg -i <package.deb>命令
ubuntu统一的安装软件命令 sudo apt-get install ** sudo dpkg -i <package.deb>
- Ubuntu 11.10 安装GMONE3,卸载 UNITY和UNITY 2D
Ubuntu 11.10安装GNOME3: 1)sudo apt-get install gnome-shell sudo apt-get install gnome-themes* (或者 ...
- MyEclipse汉化后问题
今天为了教学生如何汉化MyEclipse10.7,所以讲IDE汉化了一下. 个人还是喜欢用英文版,所以就将D:\MyEclipse\MyEclipse 10目录下的配置文件myeclipse.ini里 ...