模版 尤拉函式及性質 素數篩法

2021-07-15 14:17:07 字數 2518 閱讀 8678

對於乙個正整數n,小於n且和n互質的正整數(包括1)的個數,記作φ(n)

φ(n)=n*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)…..(1-1/pm),p為n的因子 (見initeuler())

對乙個數n,對於任意乙個素數p,p^2不是n的因子

1.!! φ(1)=1

2.不完全積性函式:若m,n互質,φ(mn)=φ(m)φ(n)

3.對於互質的正整數a和n,有aφ(n) ≡ 1 mod n

4.當n為奇數時,φ(2n)=φ(n)

5.若n是質數p的k次冪,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因為除了p的倍數(一共n/p個)外,其他數都跟n互質。

6.設a為n的質因數,若(n % a == 0 && (n / a) % a == 0) 則有e(n)=e(n / a) * a;

若(n % a == 0 && (n / a) % a != 0) 則有:e(n) = e(n / a) * (a - 1) (見initprimeandeuler())

7. ab%

p=ab

%ϕ(p

)+ϕ(

p)%p

8. 1-n中與n互質的數的和為n∗

ϕ(n)

/29. 如果n是偶數,與n互質的數有一半在[n/2,n]之間

#include 

#define mem(a,b) memset(a,b,sizeof(a))

#define rep(i,a,b) for(int i=a;i#define debug(a) printf("a =: %d\n",a);

const

int inf=0x3f3f3f3f;

const

int maxn=1e7+50;

const

int mod=1e9+7;

const

double pi=acos(-1);

typedef

long

long ll;

using

namespace

std;

/*0.對於乙個正整數n,小於n且和n互質的正整數(包括1)的個數,記作φ(n)

φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pm),p為n的因子 (見initeuler())

1.!! φ(1)=1

2.不完全積性函式:若m,n互質,φ(mn)=φ(m)φ(n)

3.對於互質的正整數a和n,有aφ(n) ≡ 1 mod n

4.當n為奇數時,φ(2n)=φ(n)

5.若n是質數p的k次冪,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因為除了p的倍數(一共n/p個)外,其他數都跟n互質。

6.設a為n的質因數,若(n % a == 0 && (n / a) % a == 0) 則有e(n)=e(n / a) * a;

若(n % a == 0 && (n / a) % a != 0) 則有:e(n) = e(n / a) * (a - 1) (見initprimeandeuler())

*/int e[maxn];

ll esum[maxn]; //字首和

//初始化尤拉函式

void initeuler()

//直接計算尤拉函式

int euler(int n)

return cnt;

}bool notprime[maxn];

int prime[maxn];

int cnt;

//初始化素數表,是否素數(prime sieve)

void initprime()

notprime[0]=notprime[1]=1;

}//初始化素數表,是否素數,尤拉函式

void initprimeandeuler()

for(int j=0,k;j1;

if (i%prime[j]==0)else }}

notprime[0]=notprime[1]=1;

}int n,m,p;

int pn[maxn>>2];

int pos;

//求n的因子

void getfac(int n)

int pm=prime[i];

if (n%pm==0)}}

}ll qpow(ll x,ll n,ll mod)

return ret;

}ll cal_kkkk(ll a,ll p)

ll cal_sum(int pos,ll n,ll m)

/*bool isprime(int n)

return 1;

}*/int main()

return

0;}

//增加乙個求尤拉函式的模版

int euler(int n)

}if(a>1) res=res/a*(a-1);

return res;

}

由素數篩法到尤拉函式(尤拉函式,線性篩)

蒟蒻最近準備狂補數學啦tat 基於篩素數,可以同時快速求出尤拉函式。於是蒟蒻準備從這裡入手,整理一下實現的思路。傳統篩素數的做法 埃式篩 是,利用已知的素數,去篩掉含有此質因子的合數,十分巧妙。由於不是本文的重點,就只貼一下 吧 include include define r register i...

素數篩法 埃氏篩及尤拉篩

在做題中會經常遇到有關素數的問題,整理一下學過的兩種素數篩法。時間複雜度 o nloglogn 我們知道乙個素數的倍數肯定是乙個合數,乙個合數可以由多個素數相乘得到,所以可以從2開始把2的倍數篩一遍,找到下個素數在篩一遍。篩完後素數的倍數都被篩掉了,剩下的就是素數。如下 const int n 1e...

素數線性篩法(尤拉篩)

之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...