魔法数字

题目背景

ASDFZ-NOIP2016模拟

题目描述

在数论领域中,人们研究的基础莫过于数字的整除关系。一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 a 的余数为 0 。

我们称一个数字 X 是魔法的,当且仅当 X 是整数,且它能被 K 及 K 以上种一位数整除,要求这若干种一位数均在 X 的十进制表示中出现。

给出整数 K、L、R,请你计算出在区间 [L,R] 中,有多少个魔法数字。

输入格式

输入一行三个整数 K、L、R。

输出格式

输出一行一个整数,表示该区间内魔法数字的个数。

样例数据 1

输入

2 1 20

输出

2

备注

【数据范围】

对于 30% 的数据,1≤L≤R≤105;

对于 50% 的数据,1≤L≤R≤106;

对于 70% 的数据,1≤L≤R≤109;

对于 100% 的数据,1≤L≤R≤1018;0≤K≤9。

数位dp" role="presentation" style="position: relative;">dpdp,f[i][j][k][0/1]" role="presentation" style="position: relative;">f[i][j][k][0/1]f[i][j][k][0/1]表示当dp" role="presentation" style="position: relative;">dpdp到第i" role="presentation" style="position: relative;">ii位,当前对252" role="presentation" style="position: relative;">252252取模余数是j" role="presentation" style="position: relative;">jj,已经满足条件的数字的状态为k" role="presentation" style="position: relative;">kk(二进制压位),当前位的选取是否受到限制。

然后写一发记搜应该就能过了吧。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[20][253][520][2],L,R;
int stat[2520],k,len,num[20];
inline int cntsolve(int x){
    int ret=0;
    while(x)x-=x&(-x),++ret;
    return ret;
}
inline ll dfs(int pos,int mod,int sta,int lim){
    if(pos>len){
        mod-=mod/2520*2520;
        if(cntsolve(sta&stat[mod])>=k){return 1;}
        return 0;
    }
    mod-=mod/252*252;
    if(~f[pos][mod][sta][lim])return f[pos][mod][sta][lim];
    int up=lim?num[pos]:9;
    ll ret=0ll;
    for(register int i=0;i<=up;++i)ret+=dfs(pos+1,mod*10+i,(i==0)?sta:(sta|(1<<(i-1))),lim&&(i==up));
    return f[pos][mod][sta][lim]=ret;
}
inline ll solve(ll x){
    len=0,memset(f,-1,sizeof(f));
    while(x)num[++len]=x-x/10*10,x/=10;
    reverse(num+1,num+len+1);
    return dfs(1,0,0,1);
}
int main(){
    scanf("%d%lld%lld",&k,&L,&R);
    for(register int i=1;i<=9;++i)
        for(register int j=0;j<2520;j+=i)
            stat[j]|=(1<<(i-1));
    printf("%lld",solve(R)-solve(L-1));
    return 0;
}

2018.07.26NOIP模拟 魔法数字(数位dp)的更多相关文章

  1. 【2018.06.26NOIP模拟】T2号码bachelor 【数位DP】*

    [2018.06.26NOIP模拟]T2号码bachelor 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的性质 ...

  2. 【2018.06.26NOIP模拟】T3节目parade 【支配树】*

    [2018.06.26NOIP模拟]T3节目parade 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的表演时间 ...

  3. 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*

    [2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...

  4. 2018.06.26 NOIP模拟 号码(数位dp)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的 ...

  5. 2018.09.07 Amount of degrees(数位dp)

    描述 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的B的整数次幂之和. 例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意: 17 = 24+20, ...

  6. 2018.08.18 NOIP模拟 game(数位dp)

    Game 题目背景 SOURCE:NOIP2015-SHY4 题目描述 Alice 和 Bob 正在玩一个游戏,两个人从 1 轮流开始报数,如果遇到 7 的倍数或者遇到的这个数的十进制表示中含 7 , ...

  7. xbz分组题B 吉利数字 数位dp入门

    B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...

  8. 2018上海大都会邀请赛J(数位DP)

    #include<bits/stdc++.h>using namespace std;int num[20];//按位储存数字int mod;long long dp[20][110][1 ...

  9. 牛客小白月赛8 - E - 诡异数字 数位DP

    牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...

随机推荐

  1. JS检测当前设备是PC还是移动端

    用到的时候找到的分享下,也是收藏下,本地收藏多了感觉找起来很麻烦 方法1: function IsPC() { var userAgentInfo = navigator.userAgent; var ...

  2. bootStrap的小知识

    代码模块 <code> 内联代码 <kbd> 用户输入 <pre>代码段 <var>数学字符 <samp>程序输出 表格 <thead ...

  3. Eclipse “cannot be resolved to a type”

    遇到这坑爹的问题,网上各种答案. 只有这个能解决我的问题,eclipse机制问题: Eclipse “cannot be resolved to a type”

  4. 可视化库-seaborn-单变量绘图(第五天)

    1. sns.distplot 画直方图 import numpy as np import pandas as pd from scipy import stats, integrate impor ...

  5. Datatable数据分组

    datatable里面的数据是按照这个顺序排列的 姓名    性别        年龄 a1          男           12 a1         女             11 a ...

  6. Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The server may already be running in another process, or a system process may be using the port. To sta

    有三种导致这种错误的原因. 第一个: 是因为tomcat的服务没有被关闭所导致的,将服务关闭即可 找到tomcat的安装目录,进入bin文件夹,找到tomcat7w.exe,双击这个文件,点击stop ...

  7. 关于HTTP协议及SOCKET通信

    一.HTTP 1.报文结构 HTTP:超文本传输协议,报文分为请求报文和响应报文. 2.端口(tomcat端口) http在熟知的80端口使用TCP的服务:tomcat的默认端口是8080 3.状态码 ...

  8. python-淘宝信息定向爬取

    S是类似产品页数  bcoffset直流偏移. 有人在将偏移量:http://www.cnblogs.com/defineconst/p/6185396.html item.taobao.com/it ...

  9. MapReduce超时原因(Time out after 300 secs)

    目前碰到过三种原因导致 Time out after 300 secs. 1. 死循环 这是最常见的原因.显式的死循环很容易定位,隐式的死循环就比较麻烦了,比如正则表达式.曾经用一个网上抄来的邮箱正则 ...

  10. spring jpa exists

    Subquery<A> subquery = criteriaQuery.subquery(A.class);Root<A> root1 = subquery.from(A.c ...