数论基础
费马小定理
P为质数 a为任意整数
$ a^{p-1} \equiv 1 (\mod p)$
线性筛
欧拉筛
for(int i=2;i<=n;i++)
{
if(!is_prime[i])
{
prime[++top]=i;
}
for(int j=1;j<=top && i*prime[j]<=n;j++)
{
is_prime[i*prime[j]]=true;
cnt[i*prime[j]]++;
if(i%prime[j]==0) break;
}
}
欧拉函数
\(\phi(n)\)是n以内与n互质的输的个数 \(\phi(1)=1\)
是积性函数 但不是完全积性函数
\(\phi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots(1-\frac{1}{p_k})\)
\(p_i\)是n的质因子
由积性函数得另一式子:
\(\phi(n)=p_1^{k_1-1}(p_1-1)*p_2^{k_2-1}(p_2-1)\cdots p_i^{k_i-1}(p_i-1)\) p为n的质因子
由上可以进行线性筛了
void get_phi()
{
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!is_prime[i]) prime[++top]=i,phi[i]=i-1;
for(int j=1;j<=top&&prime[j]*i<=n;j++)
{
is_prime[i*prime[j]]=true;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
{
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
}
欧拉定理
n与a互质
\(a^{\phi(n)} \equiv 1 (\mod n)\)
若n为质数 则变为 费马小定理
扩展欧几里得算法
\(ax+by=\gcd(a,b)\)
一定有解
\(y_1=x_2-a/b*y_2\)
\(x_1=y_2\)
因为 \(\gcd(a,0)=a\)
所以 b=0时 显然 x=1,y=0
void exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
exgcd(b,a%b,x,y);
int tmp=y;
y=x-a/b*y;
x=tmp;
}
求逆元
(不会逆元怎么打UR!)
求 m 在\(\mod p\) 意义下的逆元 p 为质数
扩展欧几里得算法求逆元
ax+by=1
a=m
b=p
mx+bp=1
取模 p 后 为 mx=1
所以x为m在模p下的逆元
费马小定理求逆元
因为 \(m^{p-1} \equiv 1(\mod p)\)
所以 \(m*m^{p-2} \equiv 1 (\mod p)\)
所以 \(m^{p-2}\) 就是m在模质数p下的逆元
快速幂即可
我数论太弱了 补了这一点点基础...
我乱打的一些 一些概念可能不对 哪里有错误 希望可以评论指出 谢谢