您的位置:首页 > 其它

POJ - 2407 - Relatives(欧拉函数 + 约数个数定理)

2017-09-23 21:38 441 查看
求出比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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: