容斥原理学习之路【容斥原理】

简介: 2014年12月8-14日,我的目标是完全搞懂容斥原理,顺便整理一下模板! 容斥原理在数学上应该算是很容易,这里就不再叙述! 以下面的一道题目为例:给出2个数字m,n;求1-m中有多少个数字与n互质(保证所有数字不超过int型)! 数组实现 #includeint p[10],k...

2014年12月8-14日,我的目标是完全搞懂容斥原理,顺便整理一下模板!

容斥原理在数学上应该算是很容易,这里就不再叙述!

以下面的一道题目为例:给出2个数字m,n;求1-m中有多少个数字与n互质(保证所有数字不超过int型)!

数组实现

#include<cstdio>
int p[10],k;//p数组用来保存n的质因子,int型n不会超过10个
void getp(int n){
    k=0;
    for(int i=2;i*i<=n;i++){
        if(n%i==0) p[k++]=i;
        while(n%i==0) n/=i;
    }
    if(n>1) p[k++]=n;//防止有比根号n大的质因子,k保存质因子个数
}
int nop(int m){
    int i,j,que[10000],top=0,t,sum;
    que[top++]=-1;//队列数组保存n所有质因子任意不相同组合的乘积
    for(i=0;i<k;i++){
        t=top;//t保存当前que长度,方便下面的循环来使用
        for(j=0;j<t;j++){
            que[top++]=que[j]*p[i]*(-1);
        }//质因子的个数:奇加偶减,因此乘以-1来换号
    }
    for(i=1,sum=0;i<top;i++)//sum来累加所有个数
        sum+=m/que[i];
    return sum;
}
int main(){
    int n,m;
    while(scanf("%d%d",&m,&n)==2){  //求1-m中多少个数字与n互质
        getp(n);//求n的质因子
        printf("%d\n",m-nop(m));//总数减去
    }
    return 0;
}

目录
相关文章
|
8月前
|
算法 测试技术 C++
【数学归纳法 组合数学】容斥原理
【数学归纳法 组合数学】容斥原理
|
机器学习/深度学习 存储 C++
[蓝桥杯] 树状数组与线段树问题(C/C++)
[蓝桥杯] 树状数组与线段树问题(C/C++)
86 0
每日刷题|回溯法解决组合问题
每日刷题|回溯法解决组合问题
|
机器学习/深度学习 算法
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
73 0
数学知识-约数
数学知识-约数
|
存储 人工智能 移动开发
备战蓝桥杯【一维前缀和】
备战蓝桥杯【一维前缀和】
132 0
备战蓝桥杯【一维前缀和】
|
算法
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
153 0
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
|
算法
leetcode-每日一题1217. 玩筹码(贪心+位运算)
判断元素的奇偶性,把奇数下标记录在odd 元素里
94 0
leetcode-每日一题1217. 玩筹码(贪心+位运算)