问题:求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


容斥原理应用(求1~r中有多少个数与n互素)的更多相关文章

  1. 2017乌鲁木齐区域赛K(容斥原理【求指定区间内与n互素的数的个数】)

    #include<bits/stdc++.h>using namespace std;const long long mod = 998244353;typedef const long ...

  2. Algorithm --> 求N以内的真分数个数

    求N以内的真分数个数 For example, if N = 5, the number of possible irreducible fractions are 11 as below. 0 1/ ...

  3. hdu 1856 求集合里元素的个数 输出最大的个数是多少

    求集合里元素的个数 输出最大的个数是多少 Sample Input41 23 45 61 641 23 45 67 8 Sample Output42 # include <iostream&g ...

  4. JDOJ 1775: 求N!中0的个数

    JDOJ 1775: 求N!中0的个数 JDOJ传送门 Description 求N!结果中末尾0的个数 N! = 1 * 2 * 3 ....... N Input 输入一行,N(0 < N ...

  5. Acdream1084 寒假安排 求n!中v因子个数

    题目链接:pid=1084">点击打开链接 寒假安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 ...

  6. Algorithm --> 求阶乘末尾0的个数

    求阶乘末尾0的个数 (1)给定一个整数N,那么N的阶乘N!末尾有多少个0?比如:N=10,N!=3628800,N!的末尾有2个0. (2)求N!的二进制表示中最低位为1的位置. 第一题 考虑哪些数相 ...

  7. 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?

    谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做? 分析: "假设两个整数数组为A和B,各有N个元素,任意两个数的和组成的数组C有N^2个元素. ...

  8. 求二叉树第K层的节点个数+求二叉树叶子节点的个数

    size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if ...

  9. Codeforces Round #467 (Div. 2) A. Olympiad[输入一组数,求该数列合法的子集个数]

    A. Olympiad time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

随机推荐

  1. uniq和sort的用法

    uniq和sort都是按行操作的linux命令. sort按文本行排序,如下所示的log文件:直接sort log即可将其排序. 容易忽略的是sort -n命令,在如下例子中将看到 如果直接sort则 ...

  2. IO流基础加强

    字节流对象:InputStream,OutputStream 缓冲字节流对象:BufferedInputStream , BufferedOutputStream 用法和字符流对象一样,但也有区别, ...

  3. php日期处理

    $datetime=strtotime(date("Y-m-d",time()));//获取当前日期并转换成时间戳 $datetime=$datetime+86400;//在时间戳 ...

  4. IE9透明filter和opacity同时生效的解决办法 IE9 hack only

    转载请注明:来自于http://www.cnblogs.com/bluers/ 问题: 假设结构如下: <div class="wrapper"> <p clas ...

  5. php 用于检测是PC还是手机访问

    <?php$ua = strtolower($_SERVER['HTTP_USER_AGENT']);$uachar = "/(iphone|android|phone|mobile| ...

  6. OpenCV例程实现人脸检测

    前段时间看的OpenCV,其实有很多的例子程序,参考代码值得我们学习,对图像特征提取三大法宝:HOG特征,LBP特征,Haar特征有一定了解后. 对本文中的例子程序刚开始没有调通,今晚上调通了,试了试 ...

  7. PYTHON开发--面向对象基础二

    一.成员修饰符 共有成员 私有成员, __字段名 - 无法直接访问,只能间接访问 1.     私有成员 1.1  普通方法种的私有成员 class Foo: def __init__(self, n ...

  8. bcov进行覆盖率统计

    kcov是在bcov基础上进行的,bcov已经很久没有维护了: 首先需要下载依赖库libdwraft,然后在configure时候进行指定: ./configure --with-libdwarf=/ ...

  9. Django设置TIME_ZONE和LANGUAGE_CODE为中国区域

    Django默认的timezone是 TIME_ZONE = 'America/Chicago' LANGUAGE_CODE = 'en-us' 设置为中国区域: TIME_ZONE = 'Asia/ ...

  10. 运输层协议----UDP

    import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j ...