對於乙個正整數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 精髓在於...