【LG2567】[SCOI2010]幸运数字
【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]幸运数字的更多相关文章
- BZOJ 1853: [Scoi2010]幸运数字
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 2117 Solved: 779[Submit][Status] ...
- Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1774 Solved: 644[Submit][Status] ...
- bzoj 1853: [Scoi2010]幸运数字 容斥
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1170 Solved: 406[Submit][Status] ...
- bzoj1853[Scoi2010]幸运数字 容斥
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 3027 Solved: 1128[Submit][Status ...
- BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理
BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理 题意: ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种 ...
- 【BZOJ 1853】 1853: [Scoi2010]幸运数字 (容斥原理)
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 2472 Solved: 911 Description 在中国 ...
- 1853: [Scoi2010]幸运数字[容斥原理]
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 2405 Solved: 887[Submit][Status] ...
- BZOJ1853 Scoi2010 幸运数字 【枚举+容斥】
BZOJ1853 Scoi2010 幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号 ...
- [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 3202 Solved: 1198[Submit][Status ...
随机推荐
- windows下xshell连接虚拟机的CentOS 7
1.虚拟机设置 2.虚拟机的“编辑”-“虚拟网络编辑器” 3.windows 中运行“cmd”,输入“ipconfig”查看ip,避免冲突 4.在虚拟机网络编辑器界面中,选择“VMnet8” 5.记住 ...
- 利用mysql的LOAD DATA INFILE的功能读取客户端文件
前言:今天在浏览某知论坛时,看到某大佬在渗透过程中使用伪造的MySQL服务端读取客户端文件,此大佬在利用过程中描述得不是很详细,作为小白的我看不懂啊,由此产生了此篇文章. 某大佬文章:https:// ...
- mvn手动上传jar到本地仓库
mvn install:install-file -Dfile=G:\elastic-project\workspace\out\artifacts\xxl_job_core_jar\xxl-job- ...
- 系统内置委托Action和func
Action委托, action是系统内置的委托,它可指向无返回值,没有参数的方法. using System; using System.Collections.Generic; using Sys ...
- VSCode批量替换使用注意问题
VSCode批量替换功能很强大,需要注意两点 1.不要搜到文件个数超过到10000时替换,这时替换过程中可能会出错崩溃(也可能是服务器上内存较小导致) 2.不要在搜索中反复替换可能会导致数据错乱 比如 ...
- linux下c++如何输入不回显
#include <stdio.h> #include <termios.h> #include <unistd.h> #include <iostream& ...
- PostgreSQL事务特性之嵌套事务
嵌套事务的实现是基于SAVEPOINT.ROLLBACK TO SAVEPOINT和RELEASE SAVEPOINT的,也就是设置一个保存点,可以回滚到保存点和释放保存点. 测试表的初始状态如下: ...
- docker系列之二:构建docker容器
1.创建在FlaskApp/app中创建Flask项目: 2.生成web项目所需的运行环境:pip3 freeze > ../requirements.txt 3.编辑Dockerfile: # ...
- 【华为云实战开发】8.如何快速搭建C#网站并实现持续集成?【华为云技术分享】
1 概述 1.1 文章目的 本文通过一个实例介绍如何使用软件开发服务DevCloud完成一个C#Web项目的开发. 1.2 项目详情 1. 项目名称:超级冷笑话网站 2. 项目简介:一个Web网站,包 ...
- plsql developer启动变慢的原因
导致原因 在plsql developer工具里面有打印的选项,进入打印设置后会调用打印机设置,显示所有已创建的打印机连接.如果当前电脑默认打印机是网络打印机,并且此网络打印机处于不可用状态时,那么p ...