题目大意:编号为N的会长,求与他互为质数编号的朋友(新朋友)有多少个?
解题思路:就是求一个与N互质的数的个数问题,直接利用欧拉函数模板求解即可。欧拉函数有两种写法,一是公式直接求解,这样的解法过于繁琐,时间复杂度也较高。所以采取另外一种方法,进行变形求解,如下code。如果需要记录所有的欧拉函数值,则可以采用递推求解,利用一个phi[n]数组进行记录。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1286
code:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int cn,n;
int phi(int n){ //欧拉函数公式模板
int res=n;
for(int i=2;i<(int)sqrt(n*1.0)+1;i++)
if(n%i==0){
res=res/i*(i-1);
while(n%i==0) n/=i;
}
if(n>1) res=res/n*(n-1);
return res;
}
int main(){
scanf("%d",&cn);
while(cn--){
scanf("%d",&n);
printf("%d\n",phi(n));
}
return 0;
}