求1~n中与m互质的数的个数

来源:互联网 发布:太极越狱没有网络 编辑:程序博客网 时间:2024/06/06 16:47

dfs版:

LL fac[80],num;void Divide(LL m){    num=0;    if(!vis[m])  {        fac[num++]=m;        return;    }    for(int i=0;i<k&&m>1;i++)    {        if(m%prime[i]==0)        {            fac[num++]=prime[i];            while(m%prime[i]==0) m/=prime[i];            if(m>1&&!vis[m])            {                fac[num++]=m;                return;            }        }    }}LL anss;void dfs(int k,int l,int s,int a){    if(k==num){        if(l&1) anss-=a/s;        else anss+=a/s;        return ;    }    dfs(k+1,l,s,a);    dfs(k+1,l+1,s*fac[k],a);    return ;}void work(int n,int m){    anss=0;    Divide(m);    dfs(0,0,1,n);}

非dfs版:

LL fac[80],num;void Divide(LL m){    num=0;    for(int i=0;prime[i]*prime[i]<=m;i++)        if(m%prime[i]==0)        {            fac[num++]=prime[i];            while(m%prime[i]==0) m/=prime[i];        }    if(m>1) fac[num++]=m;}LL work(LL n,LL m){    LL sum=0;    Divide(m);    for(int i=1;i<(1<<num);i++)    {        LL tmp=1,t=0;        for(int j=0;j<num;j++)            if((1<<j)&i) t++,tmp*=fac[j];        if(t&1) sum+=n/tmp;        else sum-=n/tmp;    }    return n-sum;}