int calc(int n,int m) { //求1~n 与m互质的数的个数
int num=getFactors(m); //先将m分解质因数
int sum=0; //先求出不互质的个数,最后用n减去该数
for(int state=1; state<(1<<num); state++) { //枚举状态
int tmp=1;
int cnt=0;
for(int i=0; i<num; i++) {
if(state&(1<<i)) {
cnt++;
tmp*=p[i];
}
}
if(cnt&1)sum+=n/tmp; //容斥
else sum-=n/tmp;
}
return n-sum;
}
//以下是题解
http://acm.hdu.edu.cn/showproblem.php?pid=1695
GCD
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4272 Accepted Submission(s): 1492