求出比n小,且与n互素数的个数;
模板题,对于一个大于1正整数n可以分解质因数:
则n的正约数的个数就是
其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。
化简后:
然后用程序表达后就是:
int phi[MAXN];
int euler_phi(int n) {
int m = (int)sqrt(n + 0.5);//防止数据偏小
int ans = n;
for(int i = 2; i <= m; i++) if(n % i == 0) {
ans = ans / i * (i - 1);//吧上面的公式化简一下就得到了
while(n % i == 0) n /= i;
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
没什么好说的,理解吧
AC代码:
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
ll euler(ll n) {
ll m = (ll)sqrt(n + 0.5);
ll ans = n;
for(ll i = 2; i <= m; i++) {
if(n%i == 0) {
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
int main() {
ll n;
while(scanf("%lld", &n) && n) {
printf("%d\n", euler(n));
}
return 0;
}