当前位置: 首页 > news >正文

洛谷题单指南-组合数学与计数-P2567 [SCOI2010] 幸运数字

原题链接:https://www.luogu.com.cn/problem/P2567

题意解读:幸运数字由6和8组成,近似幸运数字是幸运数字的倍数,求[a,b]区间内近似幸运数字的个数。

解题思路:

通过暴搜可以枚举出所有的幸运数字。

不妨设幸运数字为x、y、z,显然,如果x、y、z中有互为倍数的,可以将其中的倍数去掉。

对于[a,b]中x的倍数,其个数为b/x-(a-1)/x,原理是:1~a-1中x的倍数个数为(a-1)/x,1~b中x的倍数个数为b/x,那么[a,b]中x的倍数个数为b/x-(a-1)/x。

我们可以得到[a,b]中x的倍数个数xcnt,y的倍数个数ycnt,z的倍数个数zcnt,xcnt+ycnt+zcnt里会出现重复计算,比如既是x又是y的倍数,

既是x又是y的倍数可以认为是lcm(x,y)的倍数,个数为xycnt=b/lcm(x,y)-(a-1)/lcm(x,y),

同理,

既是y又是z的倍数个数为yzcnt=b/lcm(y,z)-(a-1)/lcm(y,z),

既是x又是z的倍数个数为xzcnt=b/lcm(x,z)-(a-1)/lcm(x,z),

xcnt+ycnt+zcnt-xycnt-yzcnt-xzcnt中,对于同时是x、y、z的倍数的个数减多了,设xyzcnt=b/lcm(x,y,z)-(a-1)/lcm(x,y,z)

最后答案是xcnt+ycnt+zcnt-xycnt-yzcnt-xzcnt+xyzcnt。

原来这,是容斥原理。

推导到多个幸运数字的情况,可以用DFS来枚举所有的子集,再根据子集中个数奇偶来确定对答案的贡献是加还是减。

剪枝事项:

1、幸运数字从大到小排,倍数更快达到上限

2、倍数如果超过上限,不再继续DFS

3、幸运数字中有互为倍数的进行去重

注意事项:

计算LCM中可能会超过long long,需要用double

100分代码:

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
vector<LL> lucky1, lucky2; //所有幸运数字
bool del[1000000];
LL a, b, ans;void init(LL x)
{if(x > b) return;lucky1.push_back(x);init(x * 10 + 6);init(x * 10 + 8);
}LL GCD(LL a, LL b)
{return b == 0 ? a : GCD(b, a % b);
}double LCM(LL a, LL b) //注意计算LCM时可能会溢出,用double存储
{return 1.0 * a / GCD(a, b) * b;
}void dfs(int idx, LL cnt, LL lcm)
{if(lcm > b) return;if(idx == lucky2.size()){if(cnt == 0) return; //空集不考虑if(cnt % 2 == 1) ans += b / lcm - (a - 1) / lcm;else ans -= b / lcm - (a - 1) / lcm;return;}dfs(idx + 1, cnt, lcm); //不选当前幸运数字if(LCM(lcm, lucky2[idx]) <= b)dfs(idx + 1, cnt + 1, LCM(lcm, lucky2[idx]));//选当前幸运数字
}int main()
{cin >> a >> b;//生成所有幸运数字init(6);init(8);//排序,去掉倍数sort(lucky1.begin(), lucky1.end());for(int i = 0; i < lucky1.size(); i++){if(del[i]) continue;lucky2.push_back(lucky1[i]);for(int j = i + 1; j < lucky1.size(); j++){if(lucky1[j] % lucky1[i] == 0) del[j] = true;}}//从大到小排序reverse(lucky2.begin(), lucky2.end());//DFS枚举所有幸运数字组合的子集,容斥计算答案dfs(0, 0, 1);cout << ans;return 0;
}

 

http://www.gsyq.cn/news/59356.html

相关文章:

  • 苏州交通便利公墓推荐:环境与服务兼备之选
  • 昆山墓地环境好的有哪些?周边值得关注的墓园推荐
  • 信誉与实力兼备:五家口碑好的动物实验机构权威指南
  • 信誉好的动物实验公司选择指南:五家值得信赖的权威机构推荐
  • 网络传输架构之gRPC讲解
  • 正规动物实验机构权威推荐:五家优质服务商深度解析
  • 动物实验机构选择指南:五家资质齐全的权威服务商推荐
  • 基于MATLAB的语音识别实现方法
  • 上海长租公寓推荐:魔方公寓领跑品质租住
  • 解锁微信封闭生态WeRSS原理分析与部署实战
  • 2025年智能化展厅定做厂家权威推荐榜单:企业展厅LED屏/企业展示展厅/展厅展馆互动多媒体源头厂家精选
  • 单片机高效并发编程:基于命名协程的轻量级多任务方案
  • 2025年11月单机游戏推荐:权威榜单与全面选择指南
  • 来挑战!Nano banana Pro 全网最低价APi,0.09/张,稳得可怕!
  • 计算机视觉:基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的零售柜商品检测识别系统(Python+PySide6界面+训练代码)(源码+文档)✅ - 实践
  • 哪家做医疗器械第三方比较好?值得信赖的服务商推荐清单!
  • 杭州可靠的GEO优化实力厂家排行榜单,短视频矩阵/GEO优化服务/GEO优化AI工具排名/GEO服务GEO优化实力厂家选哪家
  • 值得信赖的医疗器械第三方公司:资质认证 + 专业检测,让医疗产品更可靠!
  • 医疗器械第三方实验室哪家好?这几家实力口碑双在线!
  • 合规为先 安全护航 — 专业医疗器械第三方公司推荐!
  • 高级语言程序第六次作业 - 102300317
  • 2025年11月刷宝游戏推荐:知名游戏榜单与选择指南
  • 2025年绞吸式清淤船直销厂家权威推荐榜单:河道清淤船/清淤设备/绞吸式挖泥船源头厂家精选
  • SELinux笔记-3-Android官方文档 - Hello
  • 哪个医疗器械第三方公司好?资质齐全口碑佳医疗器械公司推荐!
  • 用 AI Sheets 解锁图像的力量
  • 支持海外仓一件代发的软件评测!
  • 移动防汛挡板领航者东莞市易禹门业, 质量轻铝合金防汛挡板 + 易拆装防洪防汛挡板,易禹防汛挡板守护万千场景安全
  • 50045_基于微信小程序的民宿预订管理系统
  • 2025年乌兰察布悬浮门/升降柱/快速门/直线门/空降门厂商推荐排行榜前十强最新发布