文章目录

  • 题目描述
  • 解析

题目描述

解析

迷惑。。。
首先,比较容易想到用二进制状态压缩记录1-9是否在十进制中出现过
然后就是整除的问题
如果记录余数,它的模数又有9个
开九维余数直接爆炸。。。
怎么办嘞?
有一个结论:

若k为p1、p2…pn的公倍数
那么(x%k)%pi=x%pi

因为k是p的质数,所以这个结论还是挺显然的
那么本题就可以找到1-9的最小公倍数(为2520)
使它作为模数最后再进行判断即可
时间复杂度:18(位数)*512(状态压缩)*2520(取模结果)*10(每次dp枚举)=232243200
还是炸

怎么办?
位数、状压、枚举基本没有优化的空间了
但我们注意到:有些数无需记录取模结果,依靠最后一位也能判断能否整除
首先可以想到5
但其实8也可以
怎么判断?
设填到倒数第二位时,数模4的结果为m
即:

x=4k+m

再填一位i后,变成:

40k+10*m+i

显然,8能整除40k,所以只需要判断10m+i能否被8整除即可
这样公倍数那一维就不必考虑5和8,降到了252
问题得到解决

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M = 3000500;
const int N = 200;
const int mod=252;
int k;
ll l,r,dp[20][515][255];//dp[pos][op][res]
int a[20];
int n;
ll mi[19];
ll find(int pos,int op,int res,int lim,int add5,int add8){//for(int i=pos;i<n;i++) printf("  ");//printf("pos=%d op=%d res=%d lim=%d add5=%d add8=%d\n",pos,op,res,lim,add5,add8);if(pos==0){int num=0;num+=add5&&op&(1<<(4));num+=add8&&op&(1<<(7));for(int i=1;i<=9;i++){if(i==5||i==8) continue;if(op&(1<<(i-1))&&res%i==0) num++;}//for(int i=pos;i<=n;i++) printf("  ");//printf("num=%d\n",num);ll ans=num>=k?1:0;return ans;}if(!lim&&dp[pos][op][res]!=-1) return dp[pos][op][res];ll ans=0;int mx= lim? a[pos] : 9;for(int i=0;i<=mx;i++){int oop=i?op|(1<<(i-1)):op;int aadd5=0,aadd8=0;if(pos==1){if(i==5||i==0) aadd5++;if(((res%4)*10+i)%8==0) aadd8++;}ans+=find(pos-1,oop,(ll)(i+res*10)%mod,lim&&i==mx,aadd5,aadd8);//for(int j=pos;j<n;j++) printf("  ");//printf("(i=%d ans=%d)\n",i,ans);}if(!lim) dp[pos][op][res]=ans;//for(int i=pos;i<n;i++) printf("  ");//printf("return %lld\n",ans);return ans;
}
//const int mod=1e9+7;ll solve(ll x){n=0;while(x){a[++n]=x%10;x/=10;}return find(n,0,0,1,0,0);
}
int main() {mi[0]=1;for(int i=1;i<=18;i++) mi[i]=mi[i-1]*10;memset(dp,-1,sizeof(dp));//    k=2;
//  int now=0,pre=0;
//  for(int i=1;i<=10500;i++){//      now=solve(i);
//      if(now==pre+1) printf("%d\n",i);
//      pre=now;
//  }scanf("%d",&k);//printf("k=%d",k);scanf("%lld%lld",&l,&r);printf("%lld\n",solve(r)-solve(l-1));return 0;
}
/*
2 2 20
*/

YBTOJ:魔法数字(数位dp)相关推荐

  1. Loj #6274. 数字 数位dp + 去重

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑数位dpdpdp,设计状态f[pos][flag1][flag2][flag3][flag4]f[pos][flag1][flag2][flag3 ...

  2. 小D的一串数字 (数位DP做法)

    Problem Description 小D在纸上随便写了两串数字,"23333333","0123456789".第一个串中含有7个重复的相邻的数字,第二个串 ...

  3. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  4. 数位dp(求1-n中数字1出现的个数)

    题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不能够任意取,true为没降,true为 ...

  5. bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

    1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...

  6. bzoj1833: [ZJOI2010]count 数字计数USACO37 Cow Queueing 数数的梦(数位DP)

    难受啊,怎么又遇到我不会的题了(捂脸) 如题,这是一道数位DP,随便找了个博客居然就是我们大YZ的--果然nb,然后就是改改模版++注释就好的了,直接看注释吧,就是用1~B - 1~A-1而已,枚举全 ...

  7. mysql dp.cal 显示汉子_计算1到N中各个数字出现的次数 --数位DP

    题意:给定一个数n,问从1到n中,0~9这10个数字分别出现了多少次.比如366这个数,3出现了1次,6出现了2次. 题解:<剑指offer>P174:<编程之美>P132 都 ...

  8. 51Nod-1009 数字1的数量【数位DP+记忆化搜索】

    1009 数字1的数量  给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. ...

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

    链接:https://www.nowcoder.com/acm/contest/214/E 来源:牛客网 题目描述 有一天clccle在家里玩手机,突然手机上出现了一个诡异的黑影,眼里闪烁着白光,发出 ...

  10. 2017广东工业大学程序设计竞赛决赛:G. 等凹数字(数位DP)

    Problem G: 等凹数字 Description 定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的, ...

最新文章

  1. 再看nf_conntrack: table full问题
  2. 分享几段祖传的Python代码,拿来直接使用!
  3. mysql 用户无法读取日志文件_MySQL读取Binlog日志常见的3种错误
  4. QQ炫舞手游显示进入服务器失败6,qq炫舞手游进不去怎么办 游戏进不去方法详解[多图]...
  5. Android mock单例对象,如何对Java单例模式进行mock
  6. 洛谷 P1816 忠诚题解
  7. C# 静态类的构造函数
  8. #运行后闪退_王者ios14苹果手机闪退已修复,腾讯痛失百万玩家能否再回来
  9. (Foxit PDF阅读器设置)禁止改变当前缩放比例,改善书签跳转阅读体验
  10. 模式识别—判别函数分类法(几何分类法)
  11. Hibernate下载地址
  12. 联想M7650DF加粉和重置/清零的正确方法
  13. sv信道模型是什么_信道模型(信道模型分类)
  14. Jspreadsheet v4:JavaScript 电子表格
  15. word文档 目录 导航窗格 整理
  16. visual studio 平台工具及路径
  17. 如何设计账户余额的数据准确性?
  18. 日本人为什么不吃小龙虾!
  19. unity游戏存档playerprefs
  20. 学习Python中turtle模块的基本用法(4:绘制科赫曲线和谢尔宾斯基三角形)

热门文章

  1. 服务器文件每天备份重新命名,定时备份服务器文件至本地电脑
  2. java获取整点与凌晨的时间戳
  3. mysql pmod项目_内置函数 - 数学函数 - 《Apache Doris 文档(201812)》 - 书栈网 · BookStack...
  4. c++tcp接收文件缓存多大合适_网易面经:深剖TCP协议的流量控制和拥塞控制,你懂了吗?...
  5. java 继承 冒号_java继承(extends)简单介绍
  6. gif android 点击 加载,android 加载显示gif图片的解决方案
  7. activemq和mysql_activeMQ 填坑记
  8. ndr4108贴片晶振是多少频率_关于山羊挺身你知道多少?这些干货速来了解一下...
  9. leetcode383. 赎金信(两种做法)
  10. 107. 二叉树的层序遍历 II and 102. 二叉树的层序遍历 023(BFS模板题打两道)