【LG2567】[SCOI2010]幸运数字

题面

洛谷

题目大意:

问你区间\([L,R](1\leq L\leq R\leq 10^{10})\)中有几个数是仅由\(6,8\)组成的数的倍数。

题解

首先考虑容斥。

但是这种数字去掉有倍数关系的数还有\(943\)个,还是无法直接容斥。

这时候可以借鉴一下\(meet\;in\;the\;middle\)的方式进行处理。

发现去掉前\(20\)个数后,我们剩下的数的倍数加起来只有\(10^6\)级别了,那么我们对于前面\(20\)个数的情况,我们直接容斥解决,后面的数字我们可以全部枚举出来然后排序去重。

然后这样的话还有一个小问题,就是前后合并时可能会算重,这样的话直接枚举后面每个数然后判断一下是否是前面的数的倍数即可。

复杂度经过分析其实还是可以接受的,就是常数有点大,你可以考虑开个\(O2\)或者\(20\rightarrow 19\)再用哈希表去重。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
int tot;
unsigned long long L, R, t[3000000];
bool vis[3000];
vector<unsigned long long> num;
unsigned long long fac[1000];
int siz;
void dfs(int x, unsigned long long res) {
if (res <= R && res) num.push_back(res);
if (x == tot + 1) return ;
dfs(x + 1, res * 10 + 6);
dfs(x + 1, res * 10 + 8);
}
long long solve() {
long long ans = 0;
for (register int s = 1, l = min(siz, 19); s < 1 << l; s++) {
unsigned long long lcm = 0; int tt = 0;
for (register int i = 0; i < l; i++)
if (s >> i & 1) {
if (lcm) lcm = lcm * fac[i] / __gcd(fac[i], lcm);
else lcm = fac[i];
++tt;
}
ans += (tt & 1 ? 1 : -1) * (R / lcm - (L - 1) / lcm);
}
if (siz <= 19) return ans;
tot = 0;
for (int i = 19; i < siz; i++)
for (unsigned long long j = R / fac[i] * fac[i]; j >= L; j -= fac[i])
t[++tot] = j;
sort(&t[1], &t[tot + 1]);
tot = unique(&t[1], &t[tot + 1]) - t - 1;
for (int i = 1; i <= tot; i++) {
bool flag = 1;
for (int j = 0; j < 19 && flag; j++)
if (t[i] % fac[j] == 0) flag = 0;
ans += flag;
}
return ans;
}
int main () {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
cin >> L >> R;
long long tmp = R;
while (tmp) ++tot, tmp /= 10;
dfs(1, 0);
sort(num.begin(), num.end());
for (int i = 0; i < (int)num.size(); i++) {
if (vis[i]) continue;
fac[siz++] = num[i];
for (int j = i + 1; j < (int)num.size(); j++)
if (num[j] % num[i] == 0) vis[j] = 1;
}
printf("%lld\n", solve());
return 0;
}

【LG2567】[SCOI2010]幸运数字的更多相关文章

  1. BZOJ 1853: [Scoi2010]幸运数字

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2117  Solved: 779[Submit][Status] ...

  2. Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1774  Solved: 644[Submit][Status] ...

  3. bzoj 1853: [Scoi2010]幸运数字 容斥

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1170  Solved: 406[Submit][Status] ...

  4. bzoj1853[Scoi2010]幸运数字 容斥

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3027  Solved: 1128[Submit][Status ...

  5. BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理

    BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理 题意: ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种 ...

  6. 【BZOJ 1853】 1853: [Scoi2010]幸运数字 (容斥原理)

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2472  Solved: 911 Description 在中国 ...

  7. 1853: [Scoi2010]幸运数字[容斥原理]

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status] ...

  8. BZOJ1853 Scoi2010 幸运数字 【枚举+容斥】

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

  9. [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3202  Solved: 1198[Submit][Status ...

随机推荐

  1. apache poi操作office文档----java在线预览txt、word、ppt、execel,pdf代码

    在页面上显示各种文档中的内容.在servlet中的逻辑 word: BufferedInputStream bis = null;  URL url = null;  HttpURLConnectio ...

  2. logstash之mongodb-log

    1.logstash6.5.3 配置收集mongodb的日志: 首先在mongodb服务器上部署filebeat收集日志并上传到logstash进行处理,然后上传到ES. filebeat-conf: ...

  3. 《 .NET并发编程实战》阅读指南 - 第3章

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.

  4. [转] vue前端异常监控sentry实践

    1. 监控原理 1.1 onerror 传统的前端监控原理分为异常捕获和异常上报.一般使用onerror捕获前端错误: window.onerror = (msg, url, line, col, e ...

  5. 手写Spring+demo+思路

    我在学习Spring的时候,感觉Spring是很难的,通过学习后,发现Spring没有那么难,只有你去学习了,你才会发现,你才会进步 1.手写Spring思路: 分为配置.初始化.运行三个阶段如下图 ...

  6. 基于.net core 3 和 Orleans 3 的 开发框架:Phenix Framework 7

    Phenix Framework 7 for .net core 3 + Orleans 3 发布地址:https://github.com/phenixiii/Phenix.NET7 2019052 ...

  7. edrawmax使用技巧备忘

    由于自己经常需要画图示意,在对比研究了市面上的画图软件后,最终选择了亿图图示,一来是该软件貌似简单强大,有好多现成可用的功能,二来支持国产,并且亿图团队感觉还是不错的一直在用心打磨产品,当然要支持的! ...

  8. Python中的@函数装饰器到底是什么?

    在解释@函数装饰器之前,先说一下,类中的类方法和静态方法. 在Python中完全支持定义类方法.静态方法.这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以). 区别在于:Pyt ...

  9. Java 之 Properties 集合

    一.Properties 概述 Properties 是Hashtable的子类,不允许key和value是null,并且它的key和value的类型都是String. 二.常用方法 1.构造方法 P ...

  10. android自定义圆角实线边框,圆角虚线边框,直实线,虚实线,半圆角边框

    先上图 在现实项目开发中,单纯的Button,EditText等控件远远不能满足我们项目的UI设计需求,这时候,我们就需要自己动手丰衣足食啦.接下来先给大家介绍一些属性,备注写的都非常清楚啦,我就不啰 ...