链接:https://www.nowcoder.com/acm/contest/135/A
来源:牛客网

若一个集合A内所有的元素都不是正整数N的因数,则称N与集合A无关。

  给出一个含有k个元素的集合A={a1,a2,a3,...,ak},求区间[L,R]内与A无关的正整数的个数。
  保证A内的元素都是素数

输入描述:

输入数据共两行:

第一行三个正整数L,R,k,意义如“题目描述”。

第二行k个正整数,描述集合A,保证k个正整数两两不相同。

输出描述:

输出数据共一行:

第一行一个正整数表示区间[L,R]内与集合A无关的正整数的个数

输入例子:
1 10 4
2 3 5 7
输出例子:
1

-->

示例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

分析:直接计算无关的数,要枚举计算,量很大。所以考虑转化成计算有关的数,然后用总数减去有关的数就是无关的数
如我们要计算l到r的无关的数,就等于r-l+1-(f(r)-f(l-1)),其中f(x)代表1到x的有关的数
然后计算有关的数,考虑计算有关数的时候会出现像6这样既是2的倍数又是3的倍数的数,所以我们在计算的过程中要用容斥原理来去重
这里我们考虑用二进制状态的方法来计算每个数的容斥
last=(1<<k)-1,然后通过与(1<<j)(0<=j<k)进行二进制与运算来保证循环的过程中,我们依次计算了a[0],a[0]*a[1],...,a[0]*a[1]*...*a[k-2]*a[k-1]的倍数
计算出这些数有多少个倍数后用容斥原理的奇加偶减计算最后的结果
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define debug(a) cout << #a << " " << a << endl
using namespace std;
const int maxn = 25;
const int mod = 1e9 + 7;
typedef long long ll;
ll a[maxn], k;
ll solve( ll n ) { //求1到n区间和集合a有关的数的个数
if( n == 0 ) { //特判一下1到0区间不存在,所以满足条件的数的个数当然是0
return 0;
}
ll ans = 0, last = ( 1 << k ) - 1;
//用二进制数的二进制位表示集合a里每个数的使用状态,1表示使用了,
//0表示没使用,对应二进制的第一位对应的是第一个数的使用状态,
//last表示的是k个数的最后一个枚举方式1..1,(k个1)
for( ll sta = 1; sta <= last; sta ++ ) { //这里从状态从1枚举到last,刚好把k个数的全部状态枚举了一遍
ll cnt = 0; //记录当前枚举的状态里使用的数的个数
ll flag = 0;
ll tmp = 1; //tmp存的是枚举到的数的最小公倍数
for( ll j = 0; j < k; j ++ ) {
if( sta&(1<<j) ) {
cnt ++;
tmp *= a[j];
if( tmp > n ) {
flag = 1;
break;
}
}
}
if( flag ) {
continue;
}
if( cnt&1 ) { //根据容斥定理,求k个集合的并集的元素个数时是奇加偶减
ans += n/tmp;//我们要求的是这cnt个数,假设是a2,a4,a5,要求这些数在1到n的公共倍数有多少个,
//就要先求出这cnt个数的lcm然后n/lcm即可,这里题目保证了a数组每个数都是质数,所以cnt个数的乘积即是对应的lcm
} else {
ans -= n/tmp;
}
}
return ans;
}
int main() {
ll le, ri;
while( cin >> le >> ri >> k ) {
for( ll i = 0; i < k; i ++ ) {
cin >> a[i];
}
cout << ri-le+1-(solve(ri)-solve(le-1)) << endl;
}
return 0;
}

  

牛客小白赛5 无关(relationship) 容斥原理(计算因子数的模板)的更多相关文章

  1. 牛客小白赛1 F题三视图

    链接:https://www.nowcoder.com/acm/contest/85/F来源:牛客网 题目描述 Etéreo 拿出家里的许多的立方体积木,堆成了一个三维空间中的模型.既然你高考选了技术 ...

  2. 牛客小白赛4J——强迫症

    链接:https://www.nowcoder.com/acm/contest/134/J 来源:牛客网 思路:把数列排序,把每一个重复的元素和最后一个数想加得到新数,在删掉这一元素即为去重的最少步骤 ...

  3. 牛客小白赛4 A 三角形 数学

    链接:https://www.nowcoder.com/acm/contest/134/A来源:牛客网 题目描述 铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想 ...

  4. 牛客小白赛4 C题

    乘法逆元: 一个数a 乘上 b,在mod之后再还原成本来的数 a 这里就要用到乘法逆元,(a*b)%mod*inv(b,mod)==a ll exgcd(ll a,ll b,ll &x,ll ...

  5. 牛客小白月赛6 G 指纹锁 set的自动排序 模板

    链接:https://www.nowcoder.com/acm/contest/136/G来源:牛客网 题目描述     HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁.   ...

  6. 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花

    求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...

  7. 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?

    牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...

  8. 牛客小白月赛8 - E - 诡异数字 数位DP

    牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...

  9. 牛客小白月赛18 Forsaken给学生分组

    牛客小白月赛18 Forsaken给学生分组 Forsaken给学生分组 链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网 ​ Forsaken有 ...

随机推荐

  1. Mysql之锁、事务绝版详解---干货!

    一 锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能 ...

  2. Linux 常见的常识及常用快捷键方式

    1.  ,请写出linux系统中常见一级目录的名称及作用. /root :   超级用户的家目录 /home:  普通用户的家目录 /boot:   启动目录,启动相关文件(系统内核启动文件) /de ...

  3. 浅入深出Vue:自动化路由

    在软件开发的过程中,"自动化"这个词出现的频率是比较高的.自动化测试,自动化数据映射以及各式的代码生成器.这些词语的背后,也说明了在软件开发的过程中,对于那些重复.千篇一律的事情. ...

  4. 二叉查找树(查找、插入、删除)——C语言

    二叉查找树 二叉查找树(BST:Binary Search Tree)是一种特殊的二叉树,它改善了二叉树节点查找的效率.二叉查找树有以下性质: (1)若左子树不空,则左子树上所有节点的值均小于它的根节 ...

  5. 【React踩坑记三】React项目报错Can't perform a React state update on an unmounted component

    意思为:我们不能在组件销毁后设置state,防止出现内存泄漏的情况 分析出现问题的原因: 我这里在组件加载完成的钩子函数里调用了一个EventBus的异步方法,如果监听到异步方法,则会更新state中 ...

  6. codeforces1088D_Ehab and another another xor problem交互题

    传送门 一道考验思维的交互题 大致思路就是从最高的二进制位向下询问 代入例子比如: 5 6 6 5 7 4 6 4 讨论一下 交互题的重点学会推理和归纳 #include <bits/stdc+ ...

  7. Ubuntu 16.04 硬盘安装

    自己的宏碁4741G 笔记本,已经用了6年了,最近感觉越来越慢,晚上突然想起装个Linux 玩玩,说干就干,选择了用户比较多的Ubuntu,网上下载16.04的版本,结合网上搜索到的安装教程,看似简单 ...

  8. Vue系列:Slot 插槽的使用范例

    插槽对于自定义的组件开发来说,是十分强大的功能.这篇主要做个简单梳理 插槽可以分3种: 1.简单插槽 2.具名插槽 3.作用域插槽

  9. bootstrape select使用小结

    看看上面的效果是bootstrape使用的效果.虽然不是很好看,但是符合bootstrape的风格.来看看普通的select的样式 bootstrape下的select和普通select在bootst ...

  10. JS闪电打字特效

    HTML <div class="page page-thunder-to-text"> <input id="input" type=&qu ...