欧拉模板

 1 const MAX=1000000;
 2 var   Prime:array[0..MAX] of longint;
 3       v:array[0..MAX] of boolean;
 4
 5       procedure GetPrime;
 6       var   i,j,tmp,size:longint;
 7       begin
 8             size:=0;
 9             fillchar(v,sizeof(v),0);
10             for i:=2 to MAX do
11             begin
12                   if not v[i] then
13                   begin
14                         inc(size);
15                         prime[size]:=i;
16                   end;
17                   j:=1;
18                   while (j<=size)and(prime[j]*i<MAX) do
19                   begin
20                         v[i*prime[j]]:=true;
21                         if i mod prime[j]=0 then break;
22                         inc(j);
23                   end;
24             end;
25       end;
26
27 begin
28       GetPrime;
29 end.
30 它在O(N)的时间内遍历了所有的数,并且有很多的附加信息,
31
32 那么我们是不是能在筛素数的同时求出所有数的欧拉函数呢.
33
34 答案是可以.
35
36 1.对于筛出来的素数,φ(P)=P-1.
37
38 在while循环内
39
40 2.若i mod prime[j]=0,那么φ(i*prime[j])=φ(i)*prime[j]
41
42 3.若i mod prime[j]≠0,那么φ(i*prime[j])=φ(i)*(prime[j]-1)
43
44 2,3请读者自己证明,其中3用到了欧拉函数的积性.
45
46 code:
47
48 const MAX=1000000;
49 var   Phi,Prime:array[0..MAX] of longint;
50       v:array[0..MAX] of boolean;
51
52       procedure GetPrime;
53       var   i,j,tmp,size:longint;
54       begin
55             size:=0;
56             fillchar(v,sizeof(v),0);
57             for i:=2 to MAX do
58             begin
59                   if not v[i] then
60                   begin
61                     inc(size);
62                         prime[size]:=i;
63                         phi[i]:=i-1;
64                   end;
65                   j:=1;
66                   while (j<=size)and(prime[j]*i<MAX) do
67                   begin
68                         tmp:=i*prime[j];
69                         v[tmp]:=true;
70                         if i mod prime[j]=0 then
71                         begin
72                               phi[tmp]:=phi[i]*prime[j];
73                               break;
74                         end
75                         else phi[tmp]:=phi[i]*(prime[j]-1);
76                         inc(j);
77                   end;
78             end;
79       end;
80
81 begin
82       GetPrime;
83 end.

欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数.

对φ(N)的值,我们可以通俗地理解为小于N且与N互质的数的个数.

欧拉函数的一些性质:

1.欧拉函数是积性函数,但不是完全积性函数,即φ(mn)=φ(n)*φ(m)只在(n,m)=1时成立.

2.对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn.

φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn).

3.除了N=2,φ(N)都是偶数.

4.设N为正整数,∑φ(d)=N (d|N).

根据性质2,我们可以在O(sqrt(n))的时间内求出一个数的欧拉函数值.

时间: 2024-10-29 19:10:19

欧拉模板的相关文章

《花开半夏》--2 放弃45dT

魏如风那天晚上被程秀秀一路护送回了医院,可他根本踏实不下来,夏如画灰心的表情在他脑里反复回放,让他的心一阵阵地揪起来.半夜里,他还是忍不住煎熬,从医院偷偷跑了出去.魏如风轻手轻脚地打开门锁,却发现推不动房门,他借着月光往门缝里看,发现门被几个纸盒子从里面堵住了.魏如风看着心里一阵泛酸,他知道夏如画是在害怕,阿福的事永远成不了过云烟,这么想着他又开始怨恨起自己,怎么没能保护她,现在还把她一个人扔在了家里.魏如风一边琢磨着明天一定要办出院,一边一点点地推开房门.纸箱摞得太密,魏如风跻身进去时还是不小

UVa 11768 格点判定(扩展欧几里得求线段整点)

https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后对于扩展欧几里得有了全面的了解. 根据两点式公式求出直线 ,那么ax+by=c 中的a.b.c都可以确定下来了. 接下来首先去计算出一组解(x0,y0),因为根据这一组解,你可以写出它的任意解,其中,K取任何整数. 需要注意的是,这个 a' 和 b' 是很重要的,比如说 b' ,它代表的是x每隔 b

欧拉函数

void Euler_Sieve_Method(int * euler, int n) { euler[1] = 1; for (int i = 2; i < n; i++) { euler[i] = i; } for (int i = 2; i < n; i++) { if (euler[i] == i) { for (int j = i; j < n; j += i) { euler[j] = euler[j] / i * (i - 1); } } } } void Euler_Si

UVA - 1347 Tour 双调欧几里得旅行商问题

题目大意:给出n个点,要求你从最左边那个点走到最右边那个点,每个点都要被遍历过,且每个点只能走一次,问形成的最短距离是多少 解题思路:用dp[i][j]表示第一个人走到了第i个点,第二个人走到了第j个点且已经遍历了1–max(i,j)的所有点的最短距离.因为dp[i][j] = dp[j][i]的,所以我们设i > j的 那么就有 当j < i-1 时,dp[i][j] = dp[i-1][j] + dis(i, i -1) 当j == i + 1时情况就比较特别了,这里将j用i-1代替 dp

hdu1695(莫比乌斯)或欧拉函数+容斥

题意:求1-b和1-d之内各选一个数组成数对,问最大公约数为k的数对有多少个,数对是有序的.(b,d,k<=100000) 解法1: 这个可以简化成1-b/k 和1-d/k 的互质有序数对的个数.假设b=b/k,d=d/k,b<=d.欧拉函数可以算出1-b与1-b之内的互质对数,然后在b+1到d的数i,求每个i在1-b之间有多少互质的数.解法是容斥,getans函数参数的意义:1-tool中含有rem位置之后的i的质因子的数的个数. 在 for(int j=rem;j<=factor[i

【算法学习】双调欧几里得旅行商问题(动态规划)(转)

双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这个解的一般形式为NP的(在多项式时间内可以求出) J.L. Bentley 建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点.下图(b)显示了 同样的7个点的最短双调路线.在这种情况下,多项式的算法是可能的.事实上,存

欧拉函数常用性质

欧拉函数定义:设n 为正整数,则1,2......,n中与n互质的整数个数记作f(n). 1.1 若n为素数,f(n)=n-1; 1.2 整数n=p*q,p,q为不同素数,则f(n)=f(p)*f(q)=(p-1)*(q-1) 1.3 n=p^a*q^b,f(n)=f(p^a)*f(q^b)=n*(1-1/p)*(1-1/q) 1.4 分解质因子相乘,f(n)=n*(1-1/p1)*(1-1/p2)*.......*(1-1/pk). f(100)=f(2^2*5^2)=100*1/2*4/5=

POJ2478(SummerTrainingDay04-E 欧拉函数)

Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16927   Accepted: 6764 Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b)

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 =