首先贴出代码(闭区间[1,n]范围内和m互质的数)

代码:

int solve(II n,II m){vector<II>p;for(II i=2;i*i<=m;i++){if(m%i==0){p.push_back(i);while(m%i==0) m/=i;}}if(m>1) p.push_back(m); II sz=p.size();LL sum=0;for(II i=1;i<(1<<sz);i++){II ct=0;LL mul=1;for(II j=0;j<sz;j++){if(i&(1<<j)){ct++;mul*=p[j];}}if(ct&1) sum+=n/mul;else sum-=n/mul;}return n-sum;
}

这里解释一下原理:首先假设m有x个不同的质因子,那么可以组成的因子数就是2^x-1种,然后10^18以内所有的数的质因子个数不会超过15个,所以2^15次方暴力枚举所有情况这个复杂度还是可取的。我们假设p1,p2,p3都是m的质因子,假设当前枚举的因子是p1*p2*p3那么n以内可以整除p1*p2*p3的数量就是n/(p1*p2*p3),但是这里考虑到一个会重复问题就是拥有奇数个质因数的因子的在n以内可以整除的数量已经包含了偶数个数量,但是偶数个的并不包含奇数个的,所以我们枚举的时候需要奇加偶减,这样我们算出来的ans是n以内和m不互质的数的数量,那么和m互质的数量就是n-ans。

贴上一些可以用这个方法解决的练习题:

HDU1695:这个题好像正解使用什么莫比乌斯反演,题目的意思是求[1,a],[1,b]有多少对数GCD(x,y)==k,但是(x,y)和(y,x)算一对,有一个定理如果GCD(x,y)==k ,则GCD(x/k,y/k)==1那么现在问题转化为求[1,a/k],[1,b/k]以内互质的数有多少对,现在我们要取minn=min(a/k,b/k),我们可以先求minn的欧拉函数的前缀和,然后再求minn+1到max(a/k,b/k)的数在[1,max(a/k.b/k)]以内所有与它互质的数的数量,然后把所有的加起来就可以了。

代码:

 1 //Author: xiaowuga
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 #define inf 0x3f3f3f3f
 5 #define MAX INT_MAX
 6 #define mem(s,ch) memset(s,ch,sizeof(s))
 7 const long long N=100000;
 8 const long long mod=1e9+7;
 9 typedef long long LL;
10 typedef int II;
11 typedef unsigned long long ull;
12 #define nc cout<<"nc"<<endl
13 #define endl "\n"
14 vector<LL>Euler;
15 void init_Euler(II n){
16     Euler.resize(n+1);
17     Euler[0]=0;
18     Euler[1]=1;
19     for(LL i=2;i<n;i++) Euler[i]=i;
20     for(LL i=2;i<n;i++){
21         if(Euler[i]==i){
22             for(LL j=i;j<n;j+=i)
23                 Euler[j]=Euler[j]/i*(i-1);//先进行除法防止溢出
24         }
25     }
26     for(II i=1;i<n;i++){
27         Euler[i]+=Euler[i-1];
28     }
29 }
30 int solve(II n,II m){
31     vector<II>p;
32     for(II i=2;i*i<=m;i++){
33         if(m%i==0){
34             p.push_back(i);
35             while(m%i==0) m/=i;
36         }
37     }
38     if(m>1) p.push_back(m);
39     II sz=p.size();
40     LL sum=0;
41     for(II i=1;i<(1<<sz);i++){
42         II ct=0;
43         LL mul=1;
44         for(II j=0;j<sz;j++){
45             if(i&(1<<j)){
46                 ct++;
47                 mul*=p[j];
48             }
49         }
50         if(ct&1) sum+=n/mul;
51         else sum-=n/mul;
52     }
53     return n-sum;
54 }
55 int main() {
56     ios::sync_with_stdio(false);cin.tie(0);
57     II a,b,c,d,k;
58     II T,ca=0;
59     init_Euler(100000+1000);
60     cin>>T;
61     while(T--){
62         cin>>a>>b>>c>>d>>k;
63         if(k==0||k>b||k>d){
64             cout<<"Case "<<++ca<<": "<<0<<endl;
65             continue;
66         }
67         if(b>d) swap(b,d);
68         b/=k;d/=k;
69         LL ans=Euler[b];
70         for(II i=b+1;i<=d;i++){
71             ans+=solve(b,i);
72         }
73         cout<<"Case "<<++ca<<": "<<ans<<endl;
74     }
75     return 0;
76 }

View Code

POJ2773:这个题求第n个与k互质的数。

1.一个简单的思路就是如果[1,k]中有x个与k互质的数,那么[k+1,2*k]中也有x个,每个k个一个循环都会出现x个数与k互质,而且加入y<k且y与k互质,则t*k+y也与k互质。那么我们第一个方法可以暴力算出比k小的数里面所有与k互质的数都是多少复杂度是klog(k),然后看一下n是k第几轮循环里面。然后直接确定这个数多少。

2.二分+验证的思想,首先一个数越大,那么他包含的与k互质的数一定越多对吧?这个性质不就是单调性吗?任何满足单调性的问题我们都可以用二分来解决,所以我们可以用二分,加验证的思想找到和第n个k互质的数是多少

代码:

 1 //Author: xiaowuga
 2 #include<iostream>
 3 #include<vector>
 4 using namespace std;
 5 #define inf 0x3f3f3f3f
 6 #define MAX INT_MAX
 7 #define mem(s,ch) memset(s,ch,sizeof(s))
 8 const long long N=100000;
 9 const long long mod=1e9+7;
10 typedef long long LL;
11 typedef int II;
12 typedef unsigned long long ull;
13 #define nc cout<<"nc"<<endl
14 #define endl "\n"
15 LL solve(II r,LL n){
16     vector<int>p;
17     for(II i=2;i*i<=r;i++){
18         if(r%i==0){
19             p.push_back(i);
20             while(r%i==0) r/=i;
21         }
22     }
23     if(r>1) p.push_back(r);
24     LL sum=0;
25     for(LL i=1;i<(1<<p.size());i++){
26         LL d=1,ct=0;
27         for(II j=0;j<p.size();j++){
28             if(i&(1<<j)){
29                 ct++;
30                 d*=p[j];
31             }
32         }
33         if(ct%2) sum+=n/d;
34         else sum-=n/d;
35     }
36     return n-sum;
37 }
38 int main() {
39     ios::sync_with_stdio(false);cin.tie(0);
40     II n,k;
41     while(cin>>n>>k){
42         LL l=1,r=inf*2;
43         LL ans=1;
44         while(l<r){
45             LL m=l+(r-l)/2;
46             LL t=solve(n,m);
47             if(t>=k){
48                if(t==k) ans=m;
49                r=m;
50             }
51             else{
52                 l=m+1;
53             }
54         }
55         cout<<ans<<endl;
56     }
57     return 0;
58 }

View Code

转载于:https://www.cnblogs.com/xiaowuga/p/7631291.html

容斥原理解决某个区间[1,n]闭区间与m互质数数量问题相关推荐

  1. python连接access 参数太少_paip. 解决php 以及 python 连接access无效的参数量。参数不足,期待是 1”的错误...

    paip. 解决php 以及 python 连接access无效的参数量.参数不足,期待是 1"的错误 作者Attilax  艾龙,  EMAIL:1466519819@qq.com

  2. 组合数学-容斥原理-求指定区间内与n互素的数的个数

    求指定区间内与n互素的数的个数 给出整数n和r.求区间[1,r]中与n互素的数的个数. 去解决它的逆问题,求不与n互素的数的个数. 考虑n的所有素因子pi(i=1···k) 在[1,r]中有多少数能被 ...

  3. 用树状数组解决求区间最值的问题:hdu1754

    以前都学过树状数组,但是已经差不多忘记了!不过看一看后,马上就都回忆起来了!而且感觉经过这么久的学习,对树状数组有了更深一层的领悟!个人觉得树状数组在本质上与线段树是没有区别的!都是管理区间,只不过树 ...

  4. Java解决校验区间值重复问题

    背景 在项目中需要存储区间值数据,并进行重复区间判断.终于找到一种有用的方案,特此记录一下,以防不备之需. 取值范围符号包括: 7-全闭区间 8-左闭右开区间 9-左开右闭区间 10-全开区间 下图为 ...

  5. 容斥原理之求区间中与某数互质的个数

    一,定义 为了计算时不重不漏,就要不断加减重复部分 观察到:即奇数长度的前面是加号,偶数长度的为减号 二,思路:我们这里可以通过求不互质的数,自然就能得出互质的数,求不互质比较简单(因为他们是目标的质 ...

  6. 【已解决】批处理执行,提示无效的参数量

    批处理如果提示无效的参数量,请检查路径是否有包含空格,如果路径有空格,记得加引号 加引号解决,困扰了好几个小时,突然想起很久之前看过一个帖子说过

  7. 解决,微信网页开发,网页授权域名数量不足问题

    背景:相信很多开发微信公众号的小伙伴都碰到过这个问题,微信限制我们配置网页授权域名数量,但是大部分团队肯定不止一个业务需要微信网页登录的,我们这里可以利用nginx作为代理,实现只配置一个授权域名,完 ...

  8. 秒杀所有区间相关问题

    区间问题 所谓区间问题,就是线段问题,让你合并所有线段.找出线段的交集等等.主要有两个技巧: 排序.常见的排序方法就是按照区间起点排序,或者先按照起点升序排序,若起点相同,则按照终点降序排序.当然,如 ...

  9. 【转载】容斥原理的证明及应用

    翻译:vici@cust 对容斥原理的描述 容斥原理是一种重要的组合数学方法,可以让你求解任意大小的集合,或者计算复合事件的概率. 描述 容斥原理可以描述如下: 要计算几个集合并集的大小,我们要先将所 ...

  10. java加权区间调度_区间调度问题详解

    今天给大家介绍一下区间调度问题.区间调度是一类难度比较大,但同时应用比较广的问题,经常会在面试中以各种形式出现.本文将会介绍区间调度的各种变形,希望能使大家在面临区间调度问题时得心应手,并可以在实际工 ...

最新文章

  1. 智能工业监管控制系统 ——以遵化海祥机械项目为例
  2. AD633低成本模拟乘法器
  3. Oracle HA 之 oracle 11.2 rac库配置active dataguard
  4. 招聘 | 微生太高薪招聘多组学生信官(硕士及以上),月薪12k(北京为例),全国均可办公,推荐成功者奖励2000元...
  5. [设计模式-结构型]装饰模式(Decorator)
  6. 科大讯飞回应“同传造假”:承认转写人类同传,沟通不足造成误解
  7. 微型计算机8位数据总线,微机原理答案1
  8. 通俗理解动态库与静态库区别
  9. linux进程假死的原因_谈谈 Linux 假死现象
  10. 记录一次大创项目配置服务器的心得
  11. 计算机粘贴复制快捷键,电脑粘贴复制快捷键ctrl加什么(电脑快捷键方法大全)...
  12. 均衡器--时域均衡,频域均衡,无限长迫零(Zero force\ZF)均衡器,有限长时域迫零(ZF)均衡器,无限长MSE均衡器
  13. Dynamic Graph Attention for Referring Expression Comprehension 論文閲讀筆記
  14. HDU- 1151 Air Raid(最小路径覆盖)
  15. 简书 android底部导航,Android BottomNavigationView底部导航栏的使用
  16. python 一个例子解释全局变量和局部变量
  17. 4个女人要过一座桥的问题
  18. 社区信息综合管理平台
  19. NLP数据预处理的一般方法
  20. 最大连接数与每ip连接数的限制

热门文章

  1. 科技兴国园区兴城——2019国际高科技产业园区博览会在深盛装开幕
  2. 世界500强榜单出炉:中国公司首进三强 沃尔玛居首
  3. Python Turtle绘图基础(一)——Turtle简介、绘图窗体与绘图区域
  4. /config.php,app/admin/config.php · 静水流深/wotuoquan - Gitee.com
  5. html图标命名,html 命名规范
  6. Timer定时器用法详解
  7. Nginx 企业级优化
  8. 将旧硬盘的内容克隆到新硬盘
  9. DevOps 在公司项目中的实践落地
  10. ensp路由器MTU设置1200后,ping不通丢包问题