UVA10299 题解
这题是欧拉函数模板题,直接开整。
一、题面避雷
这题原题题面并不是求
二、\varphi(n) 的定义和求解
因为这题是模板题,所以有必要说明一下。
2.1 什么是 \varphi(n)
-
首先我们可以得知,当
\gcd(a,b)=1 时,\varphi(a \cdot b)=\varphi(a) \cdot \varphi(b) 。可以称作欧拉函数是积性的。 -
插播:唯一分解定理:即任意一个大于
1 的整数均可分解质因数,且不管怎么分都只有一种质数组合。接下来计算\varphi(n) 时要用到它。 -
插播:若
n=p^k (p 是质数),则\varphi(n)=p_k-p_{k-1} 。
我们可以来证一下:
- 由唯一分解定理,设
n=\prod_{i=1}^s {p_i}^{k_i} (p_i 是质数),有\varphi(n)=n \times \prod_{i=1}^s \dfrac{p_i-1}{p_i} 。
为什么呢?我们也可以来证明一下:
由唯一分解定理和
上述是当
2.3 程序实现
相信看到这里,程序也就差不多了。先初始化 for 枚举每个
最后提醒一下别忘了第一章的坑。
三、代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int euler_phi(int n)
{
int ans=n;
for(int i=2;i*i<=n;i++)
if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0)n/=i;
}
if(n>1)ans=ans/n*(n-1);//以防n是质数,上面的分解无法筛出来。若n是合数,则上面的分解完成后n应该是1
return ans;
}
signed main()
{
int n;
while(cin>>n&&n)
{
if(n!=1)cout<<euler_phi(n)<<endl;//问这是为什么的,看第一章
else cout<<0<<endl;
}
return 0;
}
四、鸣谢
本题解因为本人太蒻大部分证明都来自于 oi-wiki。
唯一分解定理超级简的介
欧拉函数非常详的解
想了解更多?(