欧拉函数o(n)求素数

欧拉函数的定义: E(N)= ( 区间[1,N-1] 中与 N 互质的整数个数).

  对于 积性函数 F(X*Y),当且仅当 GCD(X,Y)= 1 时, F(X*Y) = F(X)* F(Y)

  任意整数可因式分解为如下形式:

    其中( p1, p2 … pk 为质数, ei 为次数 ) 

  所以

    

  因为 欧拉函数 E(X)为积性函数, 所以

    

  对于 , 我们知道 因为pi 为质数,所以 [ 1, pi-1 ] 区间的数都与 pi 互质

  对于 区间[ 1, ] ,共有 个数, 因为 只有一个质因子,

  所以与 约数大于1 的必定包含 质因子 , 其数量为

  

  所以    

  又 E(N)为积性函数,所以可得 :

    

  又因为 其中( p1, p2 … pk 为质数, ei 为次数 ) 

     但是此计算公式,除法过多,所以计算速度较慢

  在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值 ( P为N的质因子 )

    若(N%P==0 && (N/P)%P==0) 则有:E(N)=E(N/P)*P;

    若(N%P==0 && (N/P)%P!=0) 则有:E(N)=E(N/P)*(P-1);

//求[a, b]中 素数的个数
int prime[500];
int vis[500];
int phi[500];

void Prime(int n)
{
    int cnt = 0;
    memset(vis, 0, sizeof(vis));
    for (int i = 2; i<n; i++)
    {
        if (!vis[i])
        {
            prime[cnt++] = i;
            phi[i] = i - 1;
        }
        for (int j = 0; j<cnt&&i*prime[j]<n; j++)
        {
            __int64 k = i*prime[j];
            vis[k] = 1;
            if (i%prime[j] == 0)
            {
                phi[k] = phi[i] * prime[j];
                break;
            }
            else
                phi[k] = phi[i] * (prime[j] - 1);

        }
    }
}

int main (void)
{
    int a, b;
    while(scanf("%d %d", &a, &b) != EOF)
    {
        int ans = 0;
        for(int i = a; i <= b; i++)
        {
            ans += phi[i];
        }
        printf("%d\n", ans);
    }
    return 0;
}
时间: 2024-10-10 04:38:42

欧拉函数o(n)求素数的相关文章

(hdu step 7.2.1)The Euler function(欧拉函数模板题——求phi[a]到phi[b]的和)

题目: The Euler function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 166 Accepted Submission(s): 96   Problem Description The Euler function phi is an important kind of function in number theory

欧拉函数,求素数

/*=======================================================*\ | 递推求欧拉函数phi(i) 欧拉函数\varphi(n)是小于或等于n的正整数中与n互质的数的数目 \*=======================================================*/ #define N 3000000 __int64 phi[N + 100]; void Euler() { int i, j; for(i = 1; i

hdu2824 The Euler function 筛选法求欧拉函数模板题

//求a , b范围内的所有的欧拉函数 //筛选法求欧拉函数模板题 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 3000010 ; typedef __int64 ll ; int e[maxn] ; int a ,  b ; void Euler() { int i,j; for (i=1;i<maxn;i++) e[i]

数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,前n个数的约数个数筛)

线性筛 线性筛在数论中起着至关重要的作用,可以大大降低求解一些问题的时间复杂度,使用线性筛有个前提(除了素数筛)所求函数必须是数论上定义的积性函数,即对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数,若a,b不互质也满足的话则称作完全积性函数,下面说明每个筛子是怎么筛的. 最基础的是素数筛,其它三个筛都是以素数筛为前提 素数筛 void get_prime() { int pnum = 0; for(int i = 2;

lightoj1370——Bi-shoe and Phi-shoe(欧拉函数应用)

Description Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popular coach for his success. He needs some bamboos for his students, so he asked his assistant Bi-Shoe to go to the market and buy them. Plenty of

HDU3501 Calculation 2 【欧拉函数】

Calculation 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2279    Accepted Submission(s): 969 Problem Description Given a positive integer N, your task is to calculate the sum of the positi

XMU 1615 刘备闯三国之三顾茅庐(三) 【欧拉函数+快速幂+欧拉定理】

1615: 刘备闯三国之三顾茅庐(三) Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 45  Solved: 8[Submit][Status][Web Board] Description 刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代.刘备一生极具传奇色彩,早年颠沛流离.备尝艰辛最终却凭借自己的谋略终成一方霸主.那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢

POJ3090_Visible Lattice Points【欧拉函数】

Visible Lattice Points Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5653 Accepted: 3331 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 t

HDU 2824 简单欧拉函数

1.HDU 2824   The Euler function 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2824 3.总结:欧拉函数 题意:求(a,b)间的欧拉函数值的和. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio>