HDU 1286 找新朋友【欧拉函数】

欧拉函数:求1-n-1里跟n互素的数个数
欧拉函数值:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,即既是x的因数又是质数

#include <iostream>
#include <cstdio>
using namespace std;

#define ll long long
#define N 40000

int phi[N];     //素数筛选思想

void init() //递推法:时间复杂度似乎是O(nln n)
{
    int i, j;
    for(i = 1; i < N; i++)  //先标记为素数
        phi[i] = i;

    for(i = 2; i < N; i++)
        if(i == phi[i]) //此时i为素数
            for(j = i; j < N; j += i)  //i的倍数处理
                phi[j] = (phi[j] / i) * (i - 1); //j有因子i,而且i是素数,正是欧拉函数。先除防溢出
}

int main()
{
    init();
    int n,t;
    scanf("%d", &t);
    {
        while(t--)
        {
            scanf("%d",&n);
            printf("%d\n", phi[n]);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u012469987/article/details/51229240