AcWing 873. 欧拉函数(单个欧拉模板)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 873. 欧拉函数(单个欧拉模板)相关的知识,希望对你有一定的参考价值。

题目链接

https://www.acwing.com/problem/content/875/

思路

我们可以通过容斥原理得到一个计算欧拉函数的公式:
φ ( n ) = φ ( p 1 a 1 ) ∗ … ∗ φ ( p a a x ) φ(n)=φ(p_1^a_1)∗…∗φ(p_a^a_x) φ(n)=φ(p1a1)φ(paax)

= ( p 1 a 1 − p 1 a 1 − 1 ) ∗ … ∗ ( p x a x − p x a x − 1 ) =(p_1^a_1−p_1^a_1−1)∗…∗(p_x^a_x−p_x^a_x−1) =(p1a1p1a11)(pxaxpxax1)

= p 1 a 1 ∗ ( 1 − 1 p 1 ) ∗ p 2 a 2 ∗ ( 1 − 1 p 2 ) ∗ … ∗ p x a x ∗ ( 1 − 1 p x ) =p_1^a_1∗(1−\\frac1p1)∗p_2^a_2∗(1-\\frac1p2)∗…∗p_x^a^x∗(1−\\frac1p_x) =p1a1(1p11)p2a2(1p21)pxax(1px1)

= n × ∏ i = 1 x ( 1 − 1 p i ) =n\\times \\beginmatrix \\prod_i=1^x (1-\\frac1p_i) \\endmatrix =n×i=1x(1pi1)
然后我们只需要做一个试除法将这个质因子筛出来即可,防止溢出,我们先做除法,后做乘法

代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long

int n;

ll ourla(ll x)
    ll res = x;
    for(ll i = 2;i <= x / i; ++i)
        if(x % i == 0) 
            res = res / i * (i-1);
            while(x % i == 0) x /= i;
        
    
    if(x > 1) res = res / x * (x - 1);
    return res;

int main()

    ll x;
    scanf("%d",&n);
    while(n--)
        scanf("%lld",&x);
        printf("%lld\\n",ourla(x));
    
    
    
    return 0;

以上是关于AcWing 873. 欧拉函数(单个欧拉模板)的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 874. 筛法求欧拉函数(欧拉函数)

874. 筛法求欧拉函数

AcWing 220. 最大公约数 | 欧拉函数

欧拉函数知识点总结及代码模板及欧拉函数表

欧拉函数模板

AcWing 1184欧拉回路(打板子踩坑记)