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

来源:互联网 发布:哥布林升级数据 编辑:程序博客网 时间:2024/05/22 01:40

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;}

1 0
原创粉丝点击