题目地址:https://ac.nowcoder.com/acm/contest/634/C

题意


求区间[l,r]内有多少对k生互斥数对数,所谓k生互斥数即(y-k,y+k)互斥,且两个数都在区间内

注意:l,r可以从0开始!数据范围比较大,要转换思维,普通方法会超时

解题思路


(终于把大佬的代码看懂了!!(;´༎ຶД༎ຶ`) 数论是知识盲点,想不出来,想出来也不会写QAQ)

[l,r]内(x,x+2k)互斥即gcd(x,x+2k)=1也就是gcd(x,2k)=1;x对应的范围是[l,r-2*k]

举例说明:如果2k的质因子有2、3、5那么只要x含有质因子2或3或5,那么gad(x,2k)!=1

所以就要找在[l,r-2*k]内有多少数字不含有和2k相同的质因子,也就是all-被(2或3或5)整除的数字个数。

两种方法:cnt为2k质因子的个数,v[]存质因子

以2k的质因子v[0]=2,v[1]=3,v[2]=5为例:

1.for循环枚举

for(ll i=0;i<1<<cnt;i++)
{ll p=1,f=1;for(ll j=0;j<cnt;j++){if(i>>j&1)//>>的优先级比&高,判断条件:i/(2^j)是奇数p*=v[j],f*=-1;}ans+=x/p*f;
}

对于三个集合的容斥公式,应该是:

但是在上述代码执行的过程中只多减了一个x/30,所以最后只需要再加回一个。因为是一步一步执行下来的,所以和原本的容斥原理的式子不太一样,手动模拟一下,就明白了!!

2.递归遍历枚举

work(0,1,l,r);//r=r-2*k
void work(ll i,ll x,ll l,ll r)
{if(i==m){ans+=x*(r-l);return;}work(i+1,x,l,r);work(i+1,-x,l/p[i],r/p[i]);
}

把递归的树画出来最底层就是结果,和上表中最右侧的备注里的结果是一样的

14个质因子的乘积就已经超过2e+13了,所以时间复杂度在O(1e5)左右吧(没有考虑质因子分解的复杂度。。)

ac代码


都是参考排名前几的大佬的代码,具体是谁的写的代码忘了。。(._.)

1.for循环枚举

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <ctype.h>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <sstream>
#define  maxn 100005
typedef long long ll;
using namespace std;
ll v[maxn],l,r,k,cnt=0;
ll solve(ll x)
{if(x==-1) return 0;//l=0时ll ans=0;for(ll i=0;i<1<<cnt;i++){ll p=1,f=1;for(ll j=0;j<cnt;j++){if(i>>j&1)//>>的优先级比&高p*=v[j],f*=-1;}ans+=x/p*f;}return ans;
}
int main()
{scanf("%lld %lld %lld",&l,&r,&k);if(l+2*k>r)printf("0");else{k*=2;r-=k;for(ll i=2;i*i<=k;i++){if(!(k%i)){v[cnt++]=i;while(!(k%i))k/=i;}}if(k!=1) v[cnt++]=k;printf("%lld\n",solve(r)-solve(l-1));//注意写法}return 0;
}

2.递归枚举

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll l,r,n,p[100],m,i,ans;
void work(ll i,ll x,ll l,ll r)
{if(i==m){ans+=x*(r-l);return;}work(i+1,x,l,r);work(i+1,-x,l/p[i],r/p[i]);
}
int main()
{cin>>l>>r>>n;n<<=1;r-=n;l--;if(l<0)l=0;if(l>=r){puts("0");return 0;}for(i=2;i*i<=n;i++)if(n%i==0){p[m++]=i;while(n%i==0)n/=i;}if(n>1)p[m++]=n;work(0,1,l,r);cout<<ans<<endl;return 0;
}

【牛客练习44:C】小y的质数(求区间内k生互斥数对数---容斥原理+质因子分解)相关推荐

  1. 牛客练习赛44 C 小y的质数 (数论,容斥定理)

    链接:https://ac.nowcoder.com/acm/contest/634/C 来源:牛客网 题目描述 给出一个区间[L,R],求出[L,R]中孪生质数有多少对. 由于这是一个区间筛质数的模 ...

  2. 牛客练习赛44 A 小y的序列 (模拟,细节)

    链接:https://ac.nowcoder.com/acm/contest/634/A 来源:牛客网 小y的序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...

  3. 牛客练习赛44 B 小y的线段 (思维)

    链接:https://ac.nowcoder.com/acm/contest/634/B 来源:牛客网 题目描述 给出n条线段,第i条线段的长度为a_ia i ​ ,每次可以从第i条线段的j位置跳到第 ...

  4. 牛客练习赛96 C小y的序列

    链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 给出长度为nnn的序列a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​及一个数kkk,定义一段 ...

  5. 牛客小白月赛2-B小马过河(求点到直线的垂足)

    题目链接 求点到直线的垂足分为 空间 .平面 原理: 空间: #include<iostream> #include<cmath> using namespace std; c ...

  6. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  7. 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m

    剑指offer:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他 ...

  8. 牛客挑战赛42 A.小睿睿的数列

    牛客挑战赛42 A.小睿睿的数列 题目链接 题目描述 小睿睿给了你一个长度为n的数列,他想问你该数列中满足条件(区间内存在某个数是区间内所有数的公因数)的最长区间有多少个 输入描述: 第一行 111 ...

  9. 牛客练习赛40 A.小D的剧场

    链接:https://ac.nowcoder.com/acm/contest/369/A?&headNav=acm 来源:牛客网 题目描述 "我明白." 作为这命运剧场永远 ...

  10. 牛客ACM赛 B [小a的旅行计划 ]

    链接 B 小a的旅行计划 把\(n\)个数中选任意数分成\(a,b\)两个集合,集合无区别,要求不包含且有交,求方案数.\(n\leq 10^{13}\) 首先讨论\(a,b\)并集是否为全集: 若是 ...

最新文章

  1. 几种常见自动化测试框架
  2. C#会重蹈覆辙吗?系列之2:反射及元数据的性能问题
  3. blade企业级开发平台
  4. 小众的分布式版本管理工具Code Co-op
  5. canopen服务器协议,ZOPC_Server(ZLG通用OPC服务器)CANopen协议插件
  6. 老版本fortran语言 内存无效_编程语言的分类
  7. 灵魂发明家自述:我就是靠这个创业成功的
  8. 优秀的算法工程师都是不用深度学习的
  9. input 下面的span 标签 作为下拉框选项的点击
  10. a1277以太网适配器驱动_福禄克DSX系列工业以太网连接器集锦
  11. java的datatype_java基本数据类型--Basic Datatypes
  12. MapGIS数据中心是什么?
  13. 国产ERP有没有机会击败SAP ?
  14. NPS——搭建属于你的内网穿透平台
  15. c语言程序设计的删除函数,详解C语言中的rename()函数和remove()函数的使用方法
  16. html怎么唤起虚拟键盘,电脑虚拟键盘怎么打开?电脑虚拟键盘打开五大方法介绍...
  17. PDF convert(多个pdf合并的脚本)
  18. i7 10700k和i9 9900k对比哪个好
  19. 解决EMD端点效应的方法比较
  20. 计算机架构设计的 8 个伟大思想

热门文章

  1. 安装oracle 10g 的艰难之旅
  2. Ubuntu中vim编辑器的常用操作
  3. 以xml格式发送外部系统交易错误_在知行EDI系统中实施SNIP验证
  4. jsjavaScript打印99乘法表
  5. Java基础,使用双循环嵌套,实现输出1-1000之间所有的素数,并统计有多少个
  6. 在成长中遇到的挫折事件对你的影响_孩子一遇到困难就退缩?3个方法培养孩子逆商,提升抗挫折能力...
  7. 2021海口高考调研成绩查询,2021海口市地区高考成绩排名查询,海口市高考各高中成绩喜报榜单...
  8. swing中解决中文乱码问题
  9. 如何从一个html页面调用另外一个页面的js函数,解决同一页面中两个iframe互相调用jquery,js函数的方法...
  10. linux部署rabbit mq,Linux安装rabbitmq遇到的问题