题意

询问区间$(l, r)$中有多少个数是只含$6, 8$的数的倍数

Sol

思路很妙啊。

首先在$10^{10}$内只含$6, 8$的数有$\sum_{i = 1}^{10} 2^i = 2046$个。

然后去掉相同的,应该是有$943$个。

之间算不好算,考虑用容斥原理。

但是直接容斥的复杂度很显然是$2^n$的

考虑剪枝!

当前的数大于上界,肯定要return

由于题目规定的数在$\sqrt {10^{10}}$内也就十几个,因此是可以跑过的。

注意中间算lcm的时候是会爆long long的!我们需要先转成double,再判断

// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stack>
#include<vector>
#include<cstring>
#define int long long
//#define int long long
using namespace std;
const int MAXN = 1e6;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9'){if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int Mx = 10000000000LL;
vector<int> a;
int flag[MAXN], vis[MAXN], b[MAXN], out, cnt, l, r;
void Pre(int now) {if(now >= Mx) return ;a.push_back(now);Pre(now * 10 + 6); Pre(now * 10 + 8);
}
void dfs(int dep, int x, int opt) {if(x > r) return ;if(dep > cnt) {if(x != 1) out -= opt * (r / x - (l - 1) / x); return ;}dfs(dep + 1, x, opt);int g = x / __gcd(x, b[dep]);if((double) g * b[dep] > (double)r) return;dfs(dep + 1, g * b[dep], opt * -1);
}
int solve() {dfs(1, 1, 1);return out;
}
main() {Pre(6);Pre(8);for(int i = 0; i < a.size(); i++) for(int j = 0; j < a.size(); j++)if((i != j) && (a[j] > a[i]) && (a[j] % a[i] == 0)) flag[j] = 1;for(int i = 0; i < a.size(); i++)if(!flag[i]) b[++cnt] = a[i]; sort(b + 1, b + cnt + 1, greater<int>());l = read(), r = read();printf("%lld", solve());return 0;
}
/*
1000 1000
*/

转载于:https://www.cnblogs.com/zwfymqz/p/9542666.html

BZOJ1853: [Scoi2010]幸运数字(容斥原理)相关推荐

  1. 【bzoj1853】[Scoi2010]幸运数字 容斥原理+搜索

    题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是&quo ...

  2. bzoj1853: [Scoi2010]幸运数字 dp+容斥原理

    在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是"幸运号 ...

  3. bzoj1853 [Scoi2010]幸运数字

    http://www.elijahqi.win/archives/3883 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码 ...

  4. [luogu2576 SCOI2010] 幸运数字 (容斥原理)

    传送门 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,66 ...

  5. P2567 [SCOI2010]幸运数字

    P2567 [SCOI2010]幸运数字 题意: 我们规定只含6或8的数字为幸运号码,而幸运号码的倍数我们也认为是幸运号码,问[l,r]中有多少个幸运号码? 题解: 第一反应是数位dp,但其实不是,我 ...

  6. [SCOI2010]幸运数字

    题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是&quo ...

  7. 【BZOJ-18532393】幸运数字Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 1817  Solved: 665 [Submit][Statu ...

  8. 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

    容斥的神 [HAOI2008]硬币购物 problem solution code CF559C Gerald and Giant Chess problem solution code [SCOI2 ...

  9. [BZOJ1853][SCOI2010][容斥原理]幸运数字

    Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,88 ...

最新文章

  1. ThreadLocal的正确使用与原理
  2. using 指令是不需要的和其他两个C#错误
  3. 中国蚁剑的下载、安装与使用
  4. 微信小程序的z-index在苹果ios无效
  5. 2017百度之星程序设计大赛 - 复赛 01,03,05
  6. .NET异步程序设计之任务并行库
  7. 南昌理工学院计算机网络技术专业怎么样,南昌理工学院怎么样 重点专业是什么...
  8. 【数据结构与算法】双链表V3.0的Java实现
  9. Linux基本命令介绍
  10. LeetCode - 9. 回文数
  11. VBA自定义方法 快捷键设置
  12. G.8032 ERPS 轻松强固网络安全!
  13. pywin32、win32api、win32gui、win32com、win32con 都是啥?
  14. android 刷路由器,荣耀立方WS860s路由器完整刷机包怎么使用?荣耀立方刷机图文教程...
  15. 软件实施工程师的经验之谈(适合新手,老鸟请指正)
  16. 北斗时钟同步服务器,电力系统卫星时钟-GPS北斗时钟方案
  17. 网站服务器mine类型设置,windows服务器如何配置MIME类型
  18. 智能镜像分发工具dragonfly的安装和使用
  19. ggplot多图叠加_R作图 ggplot2图片的布局排版
  20. python多条件求和_python – Numpy:条件求和

热门文章

  1. java跳出循环break;return;continue使用
  2. Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用
  3. VC++ 进度条更新方案
  4. Redis开发运维实践数据操作之HyperLogLog操作
  5. Android控制文字水平间距android:letterSpacing
  6. MySQL双主(master-master)补充
  7. Backbone模型
  8. 扬帆技术论坛系统封装工具 SPAT v 5.5.3.6_BETA1[官方最新版]
  9. Linux学习笔记:GDB常用命令
  10. IT运维管理为重,从业务需求看网管系统的选择