首页 > 学院 > 开发设计 > 正文

[POJ2407]欧拉函数的值

2019-11-11 01:59:16
字体:
来源:转载
供稿:网友

原题

题目描述

给定整数n,求n的欧拉函数的值

输入

多组数据 每行一个整数,表示n( 1 <= n <= 1,000,000,000) 一个0,表示输入结束

输出

每行输入一个整数,表示对应的n的欧拉函数值

样例输入

7 12 0

样例输出

6 4

分析

要解决这道题,我们先来了解什么是欧拉函数和欧拉定理。

欧拉函数φ:不超过n的且与n互质的正整数的个数。 如果n为素数p,则φ(p)=p−1 如果n为素数p的幂次pa,则φ(pa)=(p−1)∗pa−1. 欧拉函数为积性函数:如果n为任意两个互质的数a、b的积,则φ(n)=φ(a)∗φ(b)

n=p1a1∗p2a2∗……∗pkakφ(n)=n∗(1−1/p1)∗(1−1/p2)∗……∗(1−1/pk)

欧拉定理: 若a与m互质,则aφ(m)≡1(mod m)

所以,我们就得出了欧拉计算函数。

int euler(int n){ int m=int(sqrt(n+0.5)),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;}

源代码

#include<iostream>#include<cstdio>#include<cmath>using namespace std;int euler(int n){ int m=int(sqrt(n+0.5)),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;}int main(){ int x; while(scanf("%d",&x)&&x) PRintf("%d/n",euler(x));}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表