欧拉函数

\varphi(1)=1(小于等于1的正整数中唯一和1互质的数就是1本身)。

n质数pk\varphi(n)=\varphi(p^k)=p^k-p^{k-1}=(p-1)p^{k-1},因为除了p倍数外,其他数都跟n互质。

欧拉函数是积性函数,即是说若m,n互质\varphi(mn)=\varphi(m)\varphi(n)

例如\varphi(72)=\varphi(2^3\times3^2)=2^{3-1}(2-1)\times3^{2-1}(3-1)=2^2\times1\times3\times2=24

#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>

using namespace std;

/*
 * 筛法+欧拉函数
 * */
#define MAX_PRIME 10000
#define MAX_PRIME_LEN 5000

int P[MAX_PRIME_LEN];   //prime array
bool vis[MAX_PRIME+10];
int tot;

/* 筛法求素数表 */
void getprime()
{
    tot = 0;
    memset(vis,false,sizeof(vis));
    for(int i=2;i<=MAX_PRIME;i++)
        if(!vis[i])
        {
            P[tot++] = i;
            for(int j=i*i;j<=MAX_PRIME;j+=i)
                vis[j] = true;
        }
    return;
}

/* 欧拉函数 */
int euler(int N)
{
    int res = N;
    for(int i=0;i<tot && P[i]*P[i]<=N;i++)
        if(N%P[i]==0)
        {
            res = res/P[i]*(P[i]-1);
            /*
             *     设Ki为原数中包含P[i]这个因数的幂次数,
             * 则有N = P1^K1*P2^K2*...*Pn*Kn,
             * 每找到一个因数P[i],res/P[i]就可以可以得到P[i]^(Ki-1)
             * 将所有的找到的因数所得的结果合在一起,则可以得到
             * P1^(k1-1)*P2^(K2-1)*...*Pn^(Pn-1)。
             *     又每次都乘以了P[i]-1,则可以依据公式得到最终结果。
             * */
            while(N%P[i]==0) N /= P[i];
        }
    if(N>1) res = res/N*(N-1);  //剩余的是一个大素数。
    return res;
}

int main()
{
    getprime();
    int N;
    scanf("%d",&N);
    printf("%d\n",euler(N));
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值