欧拉函数相关的题目

POJ 1284

求原根个数:

  即求 euler(euler(p)) = euler(p-1) 其中p为奇素数

  又有 euler(x) = x*(1-1/p1)*...*(1-1/pk)  其中pk为x的质因数

#include <cstdio>
#include <cstring>

int all, p, ans, num[100000];
bool pd[100000];

int main()
{
    pd[1] = 1;
    for(int i = 1; i < 100000; i++)
        if(!pd[i])
        {
            num[all++] = i;
            for(int j = i+i; j < 100000; j += i)
                pd[j] = 1;
        }
    while(scanf("%d", &p) != EOF)
    {
        ans = --p;
        for(int i = 0; i < all && num[i] <= p; i ++)
            if(p%num[i] == 0)
                ans = ans/num[i]*(num[i]-1);
        printf("%d\n", ans);
    }
    return 0;
}

POJ 2407

求与n互质的个数:

  即求euler(n)

#include <cstdio>
#include <cstring>

int all, num[100000], ans, n;
bool pd[100000];

int main()
{
    pd[1] = 1;
    for(int i = 1; i <= 100000; i++)
        if(!pd[i])
        {
            num[all++] = i;
            for(int j = i+i; j <= 100000; j += i)
                pd[j] = 1;
        }
    while(scanf("%d", &n) != EOF)
    {
        if(n == 0) break;
        ans = n;
        for(int i = 0; i < all && num[i] <= n; i ++)
            if(n%num[i] == 0)
            {
                ans = ans/num[i]*(num[i]-1);
                while(n%num[i] == 0)
                    n /= num[i];
            }
        if(n != 1)
            ans = ans/n*(n-1);
        printf("%d\n", ans);
    }
    return 0;
}

POJ 2478

求解前n项欧拉函数之和

看到网上一个比较漂亮的求解欧拉函数的方法。

整个求法其实类似筛法求素数。

对于任何数 x = 2^k * p 其中p为奇数,以下用phi即那个希腊字符表示欧拉函数

故 对于k>0 phi[x] = 2^k * ( 1 - 1/2) * phi[p] = 2^(k-1) * phi[p] = 2^(k-1) * p * (1-1/p1) * ... * (1- 1/pn) = x/2 * (1-1/p1) * ... * (1- 1/pn) 其中p1 .. pn 为p的质因子。 故每次筛法求出素数时可以向上进行求解欧拉函数。

对于k=0 phi[x] = x * (1-1/p1) * ... * (1- 1/pn)

故有此算法

可以大致看出 复杂度不差于O(nlgn)

#include <cstdio>
#include <cstring>
#define MAXN 1000005
int phi[MAXN], n;
long long sum[MAXN];

void get_phi()
{
    phi[1] = 0;
    for(int i = 2; i < MAXN; i++)
        if(i&1)
            phi[i] = i;
        else
            phi[i] = i/2;
    for(int i = 2; i < MAXN; i++)
        if(phi[i] == i) // i为素数
            for(int j = i; j < MAXN; j += i)
                phi[j] = phi[j]/i*(i-1);
}

int main()
{
    get_phi();
    for(int i = 1; i < MAXN; i ++)
        sum[i] = sum[i-1]+phi[i];
    while(scanf("%d", &n) != EOF && n)
        printf("%lld\n", sum[n]);
    return 0;
}

时间: 2024-10-12 02:55:42

欧拉函数相关的题目的相关文章

一类欧拉函数相关的求和式推导

\(\\\) 写在前面 因为最近做了不少和欧拉函数相关的求和问题,而这一类求和的推导有没有涉及到反演和卷积,所以单独写一写. 给出的题目顺序与难度大致无关,是按照个人做题的顺序安排的. 再次声明欧拉函数的定义:\(\varphi(x)\) 表示 \([1,x]\) 里的所有整数中,与 \(x\) 互质的数的个数. 下面的叙述中均用 \((x,y)\) 表示 \(gcd(x,y)\) ,用 \([x,y]\) 表示 \(lcm(x,y)\) . \(\\\) 欧拉函数的两种常用求法 公式法,单点复

数学 欧拉函数相关

欧拉函数相关 1,\(phi(i)\)表示在1到i的数中与i互质的数的个数. 2,\(O(\sqrt{n})\)求\(phi\) ? 算数基本定理: \[ phi(i)=i*(p_1-1)/p_1*(p_2-1)/p_2*--*(p_k-1)/p_k \] ? 枚举质因数套公式即可: ? code: int phi(int x){ int re=x; for(int i=2;i*i<=x;i++){ if(x%i==0){ re=re/i*(i-1); while(x%i==0)x/=i; }

UVA - 10820欧拉函数的应用

这是一道很基础的欧拉函数的题目 题意要求  (x,y) 互质 &&x<=n&&y<=n 求互质对数 可以运用容斥,求出 phi(n)=n(1-1/n1)(1-1/n2)......(1-1/nk); 因为(2,4) (4,2) 算两对,所以 答案为 2*f(n)+1; #include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream>

欧拉计划记录帖

记录一下自己刷(水)欧拉计划的题目,(=?ω?=). (每天一两道,胜过做神仙!) 1.2/27日 前15道KO 基本都是暴力水题,第15道是道组合数学. 2.2/28日 今天要把25题的那个成就打出来! 原文地址:https://www.cnblogs.com/Leonard-/p/8485463.html

[NOI2010][bzoj2005] 能量采集 [欧拉函数+分块前缀和优化]

题面: 传送门 思路: 稍微转化一下,可以发现,每个植物到原点连线上植物的数量,等于gcd(x,y)-1,其中xy是植物的横纵坐标 那么我们实际上就是要求2*sigma(gcd(x,y))-n*m了 又有某不知名神奇定理:一个数的所有因子的phi之和等于这个数本身,其中phi是欧拉函数 因此题目转化为求如下: 我们把式子变个型,就成了如下式子: 然后一个前缀和优化,O(n+sqrt(n))解决 Code: 1 #include<iostream> 2 #include<cstdio>

POJ 2478 欧拉函数(欧拉筛法) HDU 1576 逆元求法

相关逆元求法,我之前有写过,还有欧拉函数的求法,欧拉函数与逆元的关系  点击 POJ 2478 又是一个打表的题目,一眼看出结果就是前n个欧拉函数值的和. 这里直接计算欧拉函数值求和会超时,看见多组数据. 然后就是计算欧拉函数,打表就好了. #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long LL; const int N =

算法复习——欧拉函数(poj3090)

题目: Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (x, y) does not pass through any other lattice point. For exa

poj3090欧拉函数求和

E - (例题)欧拉函数求和 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0

lightOJ1370 欧拉函数性质

D - (例题)欧拉函数性质 Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Description Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popul