质数求解
欧拉(乌拉(雾)):
\(a^{\phi\( n)}\ \equiv 1\( mod n)\)
拓展一下就是:
$a^c= $
\(1. a^{c\ mod\ \phi\( m)}\) \(gcd(a,m)=1\)
\(2. a^{c\ mod\ \phi\( m)+\phi\( m)}\) \(gcd(a,m) \ne 1\ 异或\ c \ge\ \phi\( m)\)
费🐎小定理(那就是\(\color {white}{nmsl(bushi)}\))
\(a^{p-1} \equiv 1\(%p)\)
\(p\)是质数
\(a*a^{-1} \equiv 1\)
=> \(a*a^{p-2} \equiv 1\)
威尔逊定理
\(\(p-1)! \equiv -1\( mod p)\)
是p为质数的条件,不考
中国剩余定理(\(\color {white}{中国剩男剩女定理(buni)}\))
真的看不懂=_=|||
上代码吧:
typedef long long ll;
ll ksm(ll a,ll b,ll p)
{
//省略,去这里:
}
ll inv(ll a,ll b)
{
return ksm(a,b-2,b);
}
ll crt(int n,ll *a,ll *m)
{
ll M=1,ret=0;
for(int i=1;i<=n;i++)
M*=m[i];//将所有数求出来
for(int i=1;i<=n;i++)
{
ll w=M/m[i];//求每个Sn
ret=(ret+w*inv(w,m[i])*a[i])%M;
}
return (ret+M)%M;
}
}
质数筛
质数的倍数就\(\color {red}{一定不是}\)质数
所以可以直接筛所有的质数倍数,剩下的一定是质数
当循环到当前数的因子的时候,可以跳出循环了,因为这之后的分解已经包括了当前的因子
\(CODE:\)
int p[N],tot;
bool vis[N];
void gen(int n)
{
for(int i=2;i<=n;i++)
{
if(!vis[i])
p[++tot]=i;
for(int j=1;j<=tot&&i*p[j]<=n;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0)
break;
}
}
}
积性函数
\(a\)和\(b\)互质,且\(f(a*b)=f(a)*f(b)\),则该函数为积性函数
带入线性筛:
int p[N],tot;
bool vis[N];
void gen(int n)
{
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot&&i*p[j]<=n;j++)
{
vis[i*p[j]]=1;
if(i%p[j]!=0)
phi[i*p[j]]=phi[i]*phi[p[j]];//积性函数
if(i%p[j]==0)
phi[i*p[j]]=phi[i]*p[j];//欧拉函数
break;
}
}
}