您的位置:首页 > 运维架构

[SGU 102] Coprimes [欧拉函数]

2014-07-11 12:49 302 查看
给定一个数,求不大于他的和他互质的数的个数,互质的定义是最大公约数为1

欧拉函数:若n的不同的质因子为p1, p2, ... , pr,则小于等于n的和n互质的数的个数φ(n)=n*(p1-1)/p1*(p2-1)/p2*...*(pr-1)/pr

如12=2*2*3,则φ(12)=12*1/2*2/3=4

#include <cstring>
#include <cstdio>

const int PS=10100; //size
int mpf[PS]; //for mpf[i], 0 means i is prime, otherwise equals to the min prime factor of i
int prime[PS]; //prime
int pn=0; //number of prime

void getPrime() {
memset(mpf,0,sizeof(mpf));
for (int i=2;i<PS;i++) {
if (mpf[i]==0) prime[pn++]=i;
for (int j=0;j<pn&&i*prime[j]<PS&&(prime[j]<=mpf[i]||mpf[i]==0);j++)
mpf[i*prime[j]]=prime[j];
}
}

int cal(int n) {
int lp=1,ans=n;
while (mpf
!=0) {
if (mpf
!=lp) {
lp=mpf
;
ans=ans*(lp-1)/lp;
}
n=n/mpf
;
}
if (n!=lp) ans=ans*(n-1)/n;
return ans;
}

int main() {
int n;
getPrime();
scanf("%d",&n);
printf("%d\n",cal(n));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: