NC16513 无关(relationship)
题目
题目描述
若一个集合A内所有的元素都不是正整数N的因数,则称N与集合A无关。
给出一个含有k个元素的集合A={a1,a2,a3,...,ak},求区间[L,R]内与A无关的正整数的个数。
保证A内的元素都是素数。
输入描述
输入数据共两行:
第一行三个正整数L,R,k,意义如“题目描述”。
第二行k个正整数,描述集合A,保证k个正整数两两不相同。
输出描述
输出数据共一行:
第一行一个正整数表示区间[L,R]内与集合A无关的正整数的个数
示例1
输入
1 10 4 2 3 5 7
输出
1
示例2
输入
2 10 4 2 3 5 7
输出
0
说明
对于30%的数据:1<=L<=R<=10^6
对于100%的数据:1<=L<=R<=10^18,1<=k<=20,2<=ai<=100
题解
知识点:容斥原理,数论。
经典容斥题,我们将 拆成 ,分别计算两边然后减一下就行。
众所周知, 中 的倍数个数有 。接下来考虑容斥,比如去掉 的倍数,那么计算过程为:
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; using ll = long long; int a[27]; int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); ll l, r; int k; cin >> l >> r >> k; for (int i = 1;i <= k;i++) cin >> a[i]; ll ans = 0; for (int mask = 0;mask < (1 << k);mask++) { ll mul = 1; bool f = 0; for (int i = 0;i < k;i++) if (mask >> i & 1) mul = min((__int128_t)mul * a[i + 1], (__int128_t)1e18 + 1), f ^= 1; if (mul > 1e18) continue; ans += (f ? -1 : 1) * (r / mul - (l - 1) / mul); } cout << ans << '\n'; return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/17659781.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧