欧拉筛 + 欧拉函数

 1 /**
 2  *  Fuck you.
 3  *  I love you too.
 4  */
 5 #include<bits/stdc++.h>
 6 #define lson i<<2
 7 #define rson i<<2|1
 8 #define LS l,mid,lson
 9 #define RS mid+1,r,rson
10 #define mem(a,x) memset(a,x,sizeof(a))
11 #define gcd(a,b) __gcd(a,b)
12 #define ll long long
13 #define ull unsigned long long
14 #define lowbit(x) (x&-x)
15
16 const int INF = 0x3f3f3f3f;
17 const int EXP = 1e-8;
18 const int n = 1e5 + 5;
19 const int MOD = 1e9 + 7;
20 const int MAXN = 1e5 + 5;
21
22 using namespace std;
23
24 bool notprime[MAXN];    //是否为素数
25 int prime[MAXN];        //素数表
26 int phi[MAXN];          //欧拉函数表
27
28 void euler_sieve () {
29     int tot = 0;
30     mem (notprime, 0);
31     for (int i = 2; i < MAXN; ++i) {
32         if (!notprime[i]) {
33             prime[tot++] = i, phi[i] = i - 1;
34         }
35         for (int j = 0; j < tot; ++j) {
36             if (i * prime[j] > MAXN) {
37                 break;
38             }
39             notprime[i * prime[j]] = 1;
40             if (i % prime[j] == 0) {
41                 phi[i * prime[j]] = phi[i] * prime[j];
42                 break;
43             } else {
44                 phi[i * prime[j]] = phi[i] * (prime[j] - 1);
45             }
46         }
47     }
48 }
49
50 int main() {
51     euler_sieve();
52     for (int i = 2; i <= 10; i++) {
53         cout << phi[i] << endl;
54     }
55     return 0;
56 }

原文地址:https://www.cnblogs.com/chunibyo/p/9385864.html

时间: 2024-11-03 03:33:33

欧拉筛 + 欧拉函数的相关文章

线性(欧拉)筛&amp;欧拉函数

线性筛法 what is 线性筛??就是基于最基本的筛法的优化. 在基础的筛法上,我们发现有的数字会被重复筛,例如6既会被2枚举到也会被3枚举到,必然有重复运算. 我们的做法就是让每一个数的最小因数筛. \(FOR\) \(EXAMPLE:\) 有一个数\(2 * 2 * 3 * 5\) 有另一个数 \(3 * 3 * 3* 5\) 那么第一个数枚举到3的话,筛到的数字是\(2 * 2 * 3 * 3 * 5\) 但是在第二个数字再次枚举的时候 枚举到2时 也会枚举到\(2 * 2 * 3 *

The Euler function(线性筛欧拉函数)

/* 题意:(n)表示小于n与n互质的数有多少个,给你两个数a,b让你计算a+(a+1)+(a+2)+......+b; 初步思路:暴力搞一下,打表 #放弃:打了十几分钟没打完 #改进:欧拉函数:具体证明看po主的博客 ^0^ #超时:这里直接用欧拉函数暴力搞还是不可以的,用到线性筛欧拉函数,这里总和爆int,要用long long */ #include<bits/stdc++.h> #define ll long long using namespace std; /***********

数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,前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;

hdu2421-Deciphering Password-(欧拉筛+唯一分解定理+积性函数+立方求和公式)

Deciphering Password Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2357    Accepted Submission(s): 670 Problem Description Xiaoming has just come up with a new way for encryption, by calculati

素数筛&amp;&amp;欧拉筛 BZOJ2818 Gcd BZOJ2190 [SDOI2008]仪仗队

折腾了一晚上很水的数论,整个人都萌萌哒 主要看了欧拉筛和素数筛的O(n)的算法 这个比那个一长串英文名的算法的优势在于没有多次计算一个数,也就是说一个数只筛了一次,主要是在%==0之后跳出实现的,具体的解释看的迷迷糊糊,特别是欧拉函数的求解 http://blog.csdn.net/lerenceray/article/details/12420725 代码如下 1 void ES(){ 2 for(int i=2;i<n;i++){ 3 if (!pd[i]){ 4 prime[++top]=

[SDOI2008]仪仗队(欧拉筛裸题)

题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如右图).  现在,C君希望你告诉他队伍整齐时能看到的学生人数. 输入输出格式 输入格式: 共一个数N 输出格式: 共一个数,即C君应看到的学生人数. 思路: 典型的欧拉筛 为了帮助萌新,我先从欧拉函数开讲 什么是欧拉函数? 定义:与一个数的约数有且只有1的数(互质)的个数(比如说2有1一个,6有1,5两

质因数分解+欧拉筛+线性基

质因数分解: for(int i=2;i*i<=n;i++){ if(n%i==0) p.push_back(i); while(n%i==0) n/=i; } if(n!=1) p.push_back(n); 欧拉函数(线性筛): //欧拉函数 phi[x]代表[1,x]种与x互质的数的个数 void getphi() { phi[1]=1;int cnt=0; for(int i=2;i<=N;i++){ if(!vis[i]){prime[++cnt]=i;phi[i]=i-1;} fo

noip复习——线性筛(欧拉筛)

整数的唯一分解定理: \(\forall A\in \mathbb {N} ,\,A>1\quad \exists \prod _{i=1}^{s}p_{i}^{a_{i}}=A\),其中\({\displaystyle p_{1}<p_{2}<p_{3}<\cdots <p_{s}}\)而且 \(p_{i}\)是一个质数, \(a_{i}\in \mathbb {Z} ^{+}\)(摘自维基百科) 欧拉筛通过使每个整数只会被它的最小质因子筛到来保证时间复杂度,可以用来筛质数

常见模板(欧拉筛素数,最小生成树,快排,并查集,单源最短路)

欧拉筛素数: #include<cstdio> #define maxn 10000000+10 using namespace std; int n,prime[5000001],num_prime=0,m; bool if_prime[maxn]; void euler(int limit) { for(int i=2;i<=limit;i++) { if(!if_prime[i]) prime[++num_prime]=i; for(int j=1;prime[j]*i<=l