Skip to content

Commit

Permalink
欧拉函数的线性筛法
Browse files Browse the repository at this point in the history
  • Loading branch information
Dev-XYS committed Jan 13, 2017
1 parent 954683f commit 67842d9
Showing 1 changed file with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions Euler's-Totient-Function-Sieve(Linear).cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include <cstdio>

#define MAX_ELEMENT 100000000

using namespace std;

int prime[MAX_ELEMENT], pc, div[MAX_ELEMENT], phi[MAX_ELEMENT];

void sieve(int n)
{
phi[1] = 1;
for (int i = 2; i <= n; i++)
{
if (div[i] == 0)
{
prime[pc++] = i;
div[i] = i;
phi[i] = i - 1;
}
for (int j = 0; j < pc; j++)
{
if (i * prime[j] > n) break;
div[i * prime[j]] = prime[j];
if (i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else
{
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
}

int main()
{
int n;
scanf("%d", &n);
sieve(n);
for (int i = 1; i <= n; i++)
{
printf("phi(%d) = %d\n", i, phi[i]);
}
return 0;
}

0 comments on commit 67842d9

Please sign in to comment.