题意:给定一个整数n,求不大于n且与n互质的整数个数。
思路:欧拉函数(见poj2478Farey序列)。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n;
int main(){
int i,n,res;
//freopen("a.txt","r",stdin);
cin >> n;
for(i = 2,res=n;i<=n;i++)
if(n%i == 0){
res = res/i*(i-1);
while(n%i == 0)
n /= i;
}
cout <<res<<endl;
return 0;
}
过了段时间同样的题(poj 2407)写成了这个样子:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 10000
int n,y[10000];
int main(){
while(scanf("%d",&n) && n){
int i,j,len = 1;
if(n == 1){
printf("1\n");
continue;
}
j = n;
for(i = 2;i*i<=j;i++)
while(j%i == 0){
if(i > y[len-1])
y[len++] = i;
j /= i;
}
if(j!=1)
y[len++] = j;
for(i = 1;i<len;i++)
n = n/y[i]*(y[i]-1);
printf("%d\n",n);
}
return 0;
}