CodeForces 55D Beautiful numbers(数位dp)
数位dp,三个状态,dp[i][j][k],i状态表示位数,j状态表示各个位上数的最小公倍数,k状态表示余数
其中j共有48种状态,最大的是2520,所以状态k最多有2520个状态。
#include<stdio.h>
#include<math.h>
#include<string.h>
#define LL long long
LL dp[20][50][2520];
LL div[50],rdiv[2600],po[30];
LL a[4]={2,3,5,7},num[4]={3,2,1,1},cou=0,p[30];
void getdiv(int n,LL cur)//获取48个j状态
{
if(n==4){
div[cou]=cur;
rdiv[cur]=cou++;
return ;
}
getdiv(n+1,cur);
for(int i=0;i<num[n];i++)
{
cur*=a[n];
getdiv(n+1,cur);
}
}
void getpo()
{
po[1]=1;
for(int i=2;i<20;i++)
po[i]=po[i-1]*10;
}
LL gcd(LL a,LL b)
{
if(b==0)return a;
return gcd(b,a%b);
}
LL lcm(LL a,LL b)
{
if(b==0)return a;
LL p=gcd(a,b);
return a/p*b;
}
void init()//预处理出dp[i][j][k]
{
getdiv(0,1);
getpo();
int i,j,k,l;
LL tm,ss;
dp[0][0][0]=1;
for(i=1;i<20;i++){
for(j=0;j<10;j++){
for(k=0;k<48;k++){
for(l=0;l<2520;l++){
tm=(l+j*po[i])%2520;
ss=rdiv[lcm(div[k],j)];
dp[i][ss][tm]+=dp[i-1][k][l];
}
}
}
}
}
LL solve(LL n)
{
int i,j,k,l;
for(i=1;n;i++)
{
p[i]=n%10;
n/=10;
}
int len=i;
LL ans=0,cur1=0,cur2=1,tm,ss;//cur1表示前几位上的数的余数,cur2表示前几位的数的最小公倍数
for(i=len-1;i>0;i--)
{
for(j=0;j<p[i];j++)
{
for(k=0;k<48;k++)
{
ss=lcm(cur2,j);
ss=lcm(ss,div[k]);
tm=(cur1+j)*po[i]%ss;
for(l=(ss-tm)%ss;l<2520;l+=ss)//处理48种状态,2520个余数上合法的数
ans+=dp[i-1][k][l];
}
}
cur2=lcm(cur2,p[i]);
cur1=(cur1+p[i])*10%2520;
}
return ans;
}
int main()
{
int i,j,k,t;
LL m,n;
init();
scanf("%d",&t);
while(t--)
{
scanf("%I64d%I64d",&m,&n);
printf("%I64d\n",solve(n+1)-solve(m));
}
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/ ...
随机推荐
- JS判断浏览器是否支持某一个CSS3属性的方法
var div = document.createElement('div'); console.log(div.style.transition); //如果支持的话, 会输出 "&quo ...
- linux定时器
我们常常有设置系统在某一时间执行相应动作的需求,比如设置电脑什么时候自动锁屏,什么时候自动关机,设置应用程序什么时候自动运行,什么时候自动退出.这些与时间相关的功能,都需要依靠操作系统中的定时器来实现 ...
- linux 监控系统缓存和cpu
a=`free |head -n 2 |tail -n 1 |awk '{print $7}'`if [ $a -ge 900000 ];then sync && echo 1 ...
- Fedora 18安装Google输入法和云拼音
由于sunpinyin的词库选词太不准,网友推荐在Fedora 18下使用谷歌拼音及云拼音,于是想要尝试下怎么样.由于fedora 源中谷歌拼音所以选择自行编译,做下记录以备份. #安装fcitx $ ...
- 【开源】前端练手笔记,Chrome扩展应用程序(html+CSS+JS) (1)
项目名称:github-notification 项目地址:https://github.com/WQTeam/github-notification 说明:本人打算抽时间学习前端(html + cs ...
- [Android1.5]TextView跑马灯效果
from: http://www.cnblogs.com/over140/archive/2010/08/20/1804770.html 前言 这个效果在两周前搜索过,网上倒是有转载,可恨的是转载之后 ...
- CHROME下载地址
Chrome官方独立中文安装包下载地址 一般我们安装Google Chrome浏览器都是访问 http://www.google.com/chrome/?hl=zh-CN 然后下载运行ChromeSe ...
- 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol
关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...
- BZOJ 1563 诗人小G
Description Input Output 对于每组数据,若最小的不协调度不超过\(10^{18}\),则第一行一个数表示不协调度若最小的不协调度超过\(10^{18}\),则输出"\ ...
- [HDOJ 1171] Big Event in HDU 【完全背包】
题目链接:HDOJ - 1171 题目大意 有 n 种物品,每种物品有一个大小和数量.要求将所有的物品分成两部分,使两部分的总大小尽量接近. 题目分析 令 Sum 为所有物品的大小总和.那么就是用给定 ...