首页 > 其他分享 >容斥原理应用(求1~r中有多少个数与n互素)

容斥原理应用(求1~r中有多少个数与n互素)

时间:2023-05-31 23:34:36浏览次数:45  
标签:容斥 LL 个数 back dfs 因子 互素 ans


问题:求1~r中有多少个数与n互素。


对于这个问题由容斥原理,我们有3种写法,其实效率差不多。分别是:dfs,队列数组,位运算。


先说说位运算吧:

用二进制1,0来表示第几个素因子是否被用到,如m=3,三个因子是2,3,5,则i=3时二进制是011,表示第2、3个

因子被用到



LL Solve(LL n,LL r)
{
    vector<LL> p;
    for(LL i=2; i*i<=n; i++)
    {
        if(n%i==0)
        {
            p.push_back(i);
            while(n%i==0) n/=i;
        }
    }
    if(n>1)
        p.push_back(n);
    LL ans=0;
    for(LL msk=1; msk<(1<<p.size()); msk++)
    {
        LL multi=1,bits=0;
        for(LL i=0; i<p.size(); i++)
        {
            if(msk&(1<<i))  //判断第几个因子目前被用到
            {
                ++bits;
                multi*=p[i];
            }
        }
        LL cur=r/multi;
        if(bits&1) ans+=cur;
        else       ans-=cur;
    }
    return r-ans;
}



然后就是dfs的实现:


void Solve(LL n)
{
    p.clear();
    for(LL i=2; i*i<=n; i++)
    {
        if(n%i==0)
        {
            p.push_back(i);
            while(n%i==0) n/=i;
        }
    }
    if(n>1)
        p.push_back(n);
}

void dfs(LL k,LL t,LL s,LL n)
{
    if(k==p.size())
    {
        if(t&1) ans-=n/s;
        else    ans+=n/s;
        return;
    }
    dfs(k+1,t,s,n);
    dfs(k+1,t+1,s*p[k],n);
}

//主函数内是:
dfs(0,0,1,r);




经典题目:HDU4135,HDU2841,HDU1695,HDU3501



标签:容斥,LL,个数,back,dfs,因子,互素,ans
From: https://blog.51cto.com/u_16146153/6391064

相关文章

  • Python判断一个数据结构是否为空的方法
    《EffectivePython》,里面提到判断字符串或者集合是否为空的原则。意思是:不要通过取字符串或者集合的长度来判断是否为空,而是要用not关键字来判断,因为当字符串或集合为空时,其值被隐式地赋为False.test_str=''test_tuple=()test_list=[]test_dict={}test_set=set()ifnot(test......
  • 2023湘潭邀请赛 E(容斥)
    题目跳转:E题意:输入x,k,求大小为k的不同集合个数,其中所有数的gcd+lcm=x。思路:AC代码://-----------------#include<bits/stdc++.h>#definexxfirst#defineyysecond#defineIOSios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);#definefixedf......
  • 二进制位交换,反转,与统计1的个数
    问题一:给一个整数v,求它的二进制表示中从右往左数第x位和第y位交换后的值(从0开始计数)。 分析:举个例子,如果v的二进制表示为XXXXaXXXXXXbX,我们交换第1位和第8位。我们是这样做的:先把这两位的值都取零后的值保存在一个变量里面,即tmp=XXXX0XXXXXX0X,然后再取ans=0000b000000a0,那么......
  • HDU3662(求三维凸包表面的多边形个数,表面三角形个数,体积,表面积,凸包重心,凸包中点到面
    题目:3DConvexHull题意:给定空间中的n个点,求这n个点形成的凸包的表面的多边形个数。增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况:1>在凸包内,则可以跳过2>在凸包外,找到从这个点可以"看见"的面S(看不看得见可以用法向量,看点是否在面外侧),删除这些......
  • PTA 组最小个数
       importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ArrayList<Integer>list=newArrayList<>();Scannerinput=newScanner(Syste......
  • NJUST1712(形成三角形面积为整数的个数)
    题目:1712-Triangles 题意:给定三角形的三点,分别是A,B,C,它们的横纵坐标都属于整数,然后给定两个数n和m。要求满足:, 和这3个条件的三角形个数,并且对1000000007取余。 分析:由于用的是坐标,那么我们很容易想到用叉积来表示面积,那么就得到:   然后就可以很明显知道:与一奇一偶。 然......
  • 欧拉函数与容斥
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:给定五个数,其中有和,求满足条件的有序对的个数。题目中    明确说在所有的输入中。分析:问题可以转化为和时,的有序对的个数。那么先比较和的    大小,相同的部分可以用欧拉函数的累加计算,没有公共的部分用容斥计算......
  • hdu 5768 - 中国剩余定理 + 容斥
    题解思路:利用中国剩余定理解决多个同余问题,这里需要再加一项mn=7,an=0,这样才能求出7的倍数的解,然后再需要用到容斥,2^15枚举就行了。1.扩展欧几里得: 我们观察到:欧几里德算法停止的状态是:a=gcd(a,b),b=0,那么,这是否能给我们求解xy提供一种思路呢?因为,这时候,只要a=gc......
  • 代码随想录算法训练营第16天 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111
     第六章二叉树part03 今日内容:  ●  104.二叉树的最大深度  559.n叉树的最大深度●  111.二叉树的最小深度●  222.完全二叉树的节点个数 迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。  详细布置   104.二叉树的最大深度 (优先掌......
  • 代码随想录算法训练营第六天|哈希表理论基础、242.有效的字母异位词两个数组的交集、2
    242.有效的字母异位词力扣题目链接(opensnewwindow)给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例 1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false说明: 你可以假设字符串只包含小写字母。思路:......