首页 > 其他 > 详细

欧拉函数

时间:2020-01-17 17:35:28      阅读:74      评论:0      收藏:0      [点我收藏+]

求一个数的欧拉函数

公式 Φ(n) =  n*(1-1/p1)*(1-1/p2)....(1-1/pn)   p1,p2...pn 是n的质因数

code 

ll get_euler(ll n)
{
    ll res = n;
    for (int i = 2; i <= n / i; i++)
    {
        if (n % i == 0)
        {
            res = res * (i - 1) / i;
            while (n % i == 0)
                n /= i;
        }
    }
    if (n > 1)
        res = res / n * (n - 1);
    return res;
}

求 1~n每个数的欧拉函数

code

#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <stack>
#define FT(a, b) memset(a, b, sizeof(a))
#define FAT(a) memset(a, 0, sizeof(a))
using namespace std;
typedef long long ll;
const int M = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int t, prime[M], cnt, vis[M], euler[M];
ll get_euler(ll n)
{
    ll res = 1;
    euler[1] = 1;
    for (int i = 2; i <= n; i++)
    {
        if (!vis[i])
        {
            prime[cnt++] = i;
            euler[i] = i - 1;
        }
        for (int j = 0; prime[j] <= n / i; j++)
        {
            vis[i * prime[j]] = 1;
            if (i % prime[j] == 0)
            {
                euler[i * prime[j]] = euler[i] * prime[j];
                break;
            }
            euler[i * prime[j]] = euler[i] * (prime[j] - 1);
        }
        res += euler[i];
    }
    return res;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("/home/wjy/code/c++/in.txt", "r", stdin);
#endif
    ll n;
    scanf("%lld", &n);
    FAT(vis);
    cnt = 0;
    printf("%lld\n", get_euler(n));
    return 0;
}

欧拉函数

原文:https://www.cnblogs.com/ignorance/p/12206339.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!