【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 ...
随机推荐
- jenkins+sonarqube进行代码质量检测
JavaNeverGiveUp教程篇 用jenkins+sonarqube去检查代码是非常方便的,它能检查出代码中可能存在的一些问题,比如io流未关闭.空指针异常.死循环.代码不规范等问题. 1. 搭 ...
- UVA 10852 Less Prime 题解
Less Prime Let n be an integer, 100 n 10000, nd the prime number x, x n, so that n
- Phaser也可以实现countdownLatch的功能
/** * 可用用phaser模拟countDownLatch * awaitAdvance方法:如果传入的参数和当前的phase相等,线程就阻塞住等待phase的值增加:否则就立即返回 */ pub ...
- golang学习笔记 --flag
概述 flag包提供了一系列解析命令行参数的功能接口 命令行语法 命令行语法主要有以下几种形式 -flag //只支持bool类型 -flag=x -flag x //只支持非bool类型 以上语法对 ...
- C# winform窗体简单保存界面控件参数到xml
引用网上的 XMLHelper 地址 :https://www.cnblogs.com/chnboy/archive/2009/04/02/1427652.html 稍做修改 using System ...
- 我是如何一步步编码完成万仓网ERP系统的(五)产品库设计 1.产品类别
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- PIE SDK加载WMS服务数据
1. 功能简介 WMS服务,WMS是OGC标准中比较简单也是比较重要的标准之一.它全称是“Web Map Service”(网络地图服务):利用具有地理空间位置信息的数据制作地图.其中将地图定义为 ...
- 深入挖崛:mysql主从复制原理
一.基本原理 MySQL复制过程分成三步: 1).master将改变记录到二进制日志(binary log).这些记录过程叫做二进制日志事件,binary log events: 2).slave将m ...
- 活动任务出现bug
之前做的一个活动任务发现一个bug,是以前和离职同事一起对逻辑的时候没有考虑到的,配置活动的时候应该要先查询下,如果这个产品线上在这段时间已经配置了并且上线了,则不能在做活动处理了,否则就和前面的活动 ...
- 使用vue导出excel文件
今天再开发中遇到一件事情,就是怎样用已有数据导出excel文件,网上有许多方法,有说用数据流的方式,https://www.cnblogs.com/yeqrblog/p/9758981.html,但是 ...