牛客小白月赛5 A 无关(relationship) 【容斥原理】【数据范围处理】
题目链接:https://www.nowcoder.com/acm/contest/135/A
题目描述
若一个集合A内所有的元素都不是正整数N的因数,则称N与集合A无关。
输入描述:
输入数据共两行: 第一行三个正整数L,R,k,意义如“题目描述”。 第二行k个正整数,描述集合A,保证k个正整数两两不相同。
输出描述:
输出数据共一行: 第一行一个正整数表示区间[L,R]内与集合A无关的正整数的个数
说明
对于30%的数据:1<=L<=R<=10^6 对于100%的数据:1<=L<=R<=10^18,1<=k<=20,2<=ai<=100 题解:主要使用了容斥原理,但是在实现容斥原理代码中需要特殊考虑数值类型范围,处理爆范围情况。
#include <cstdio> #define ll long long
using namespace std;
long long p[];
int k; ////容斥原理, solve 函数解出 [1,r] 中不包含 p 中所有因子的个数
long long solve(unsigned long long r) {
long long sum = ;
//共有 2^k 方钟组合
for (int i = ; i < ( << k); ++i) {
long long mult = , bits = ;
for (int j = ; j < k; ++j)
if (i&( << j)) {//与i的二进制的第j位比较,看是否为1,是则选中
bits++;//计算i中1的个数,也就是质因数的个数
mult *= p[j];
//注意 Mult 会爆 long long ,
//超出范围最高为可能为0,也可能为1,在截断为 long long 型后,必须处理才能保证正确定
if (mult > r || mult < ) mult = ;
}
if (mult &&(bits & ))//若1的个数是奇数则进行加法,否则进行减法
sum += r / mult;
else if(mult) sum -= r / mult;
}
return r - sum;//用总的数目-与n不互素的个数
} //这种解法不需要处理爆 long long 的情况
//long long solve(long long t) {
// int g = 1, i;
// long long temp1 = t;
// int count;
// while (g<(1<<k)) {
// count = 0;
// long long temp = temp1;
// for (i = 0; i < k; i++) {
// if (g&(1 << i)) {
// temp /= p[i];
// count++;
// }
// }
// if (count % 2 == 0) t += temp;
// else t -= temp;
// g++;
// }
// return t;
//} int main()
{
long long l, r;
int c = ;
scanf("%lld %lld %d", &l, &r, &k);
for (int i = ; i < k; i++)
{
scanf("%lld", &p[i]);
} long long flag = ;
for (int i = ; i < k; i++) {
if (l%p[i] == ) flag = ;
}
printf("%lld", solve(r) - solve(l) + flag);
return ;
}
牛客小白月赛5 A 无关(relationship) 【容斥原理】【数据范围处理】的更多相关文章
- 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花
求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...
- 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?
牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...
- 牛客小白月赛8 - E - 诡异数字 数位DP
牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...
- 牛客小白月赛18 Forsaken给学生分组
牛客小白月赛18 Forsaken给学生分组 Forsaken给学生分组 链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网 Forsaken有 ...
- 牛客小白月赛18 Forsaken喜欢数论
牛客小白月赛18 Forsaken喜欢数论 题目传送门直接点标题 Forsaken有一个有趣的数论函数.对于任意一个数xxx,f(x)f(x)f(x)会返回xxx的最小质因子.如果这个数没有最小质 ...
- 牛客小白月赛19 E 「火」烈火燎原 (思维,树)
牛客小白月赛19 E 「火」烈火燎原 (思维,树) 链接:https://ac.nowcoder.com/acm/contest/2272/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空 ...
- 【牛客小白月赛21】NC201604 Audio
[牛客小白月赛21]NC201604 Audio 题目链接 题目大意: 给出三点 ,求到三点距离相等的点 的坐标. 解析 考点:计算几何基础. 初中蒟蒻表示不会什么法向量.高斯消元..qwq 方法一: ...
- 【牛客小白月赛21】NC201605 Bits
[牛客小白月赛21]NC201605 Bits 题目链接 题目描述 Nancy喜欢做游戏! 汉诺塔是一个神奇的游戏,神奇在哪里呢? 给出3根柱子,最开始时n个盘子按照大小被置于最左的柱子. 如果盘子数 ...
- 牛客小白月赛16 小石的妹子 二分 or 线段树
牛客小白月赛16 这个题目我AC之后看了一下别人的题解,基本上都是线段树,不过二分也可以. 这个题目很自然就肯定要对其中一个进行排序,排完序之后再处理另外一边,另一边记得离散化. 怎么处理呢,你仔细想 ...
随机推荐
- CodeForces - 95B
Petya loves lucky numbers. Everybody knows that positive integers are lucky if their decimal represe ...
- Java集合——集合框架Iterator接口
1.集合输出 很多情况下我们需要把集合的内容进行输出,也就是遍历集合. 遍历集合的方式有以下几种: 1.Iterator 2.ListIterator 3.Enumeration(枚举方式,比较老一般 ...
- Linux中vim编辑器常用操作技巧
Normal 0 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-styl ...
- calendar 类 用法
add()和roll()区别 一.Calendar 月份从 0-11,要表示8月,应该传入7 . 二.set() 会自动转换为合法的日期,如 set(1999,8,31) 表示的是1999-09-3 ...
- 如何让nginx支持ThinkPHP框架(重点参考)
公司有一款即将上线的应用服务端是基于ThinkPHP写的,本地测试无异常,上传到外网服务器后无法连接.这可把我和我的小伙伴们吓死了,怎么回事儿,本地测试都是对的呀! 我和我的小伙伴们开始找原因,换了一 ...
- sql server 分析
查询指令,查询数据库的版本 SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPE ...
- 排序算法对比,步骤,改进,java代码实现
前言 发现是时候总结一番算法,基本类型的增删改查的性能对比,集合的串并性能的特性,死记太傻了,所以还是写在代码里,NO BB,SHOW ME THE CODE! github地址:https://gi ...
- js 限制文本框不能输入单引号
<input onkeydown="if(event.keyCode==32||event.keyCode==188||event.keyCode==222){return false ...
- Oracle单列函数
--字符函数--1.ASCII 返回与指定的字符对应的十进制数;select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space fr ...
- C# 的两种debug 方法
第一种:需要把调试方法改成debug代码用 #if DEBUG 包裹 using System; using System.Collections.Generic; using System.Text ...