1.如何求1~N内的所有素数(埃拉筛法)
void init()
{
for(long long i=2;i<N;i++)
{
if(!v[i])
{
prime[p++]=i;
for(long long j=i*i;j<N;j+=i)
{
v[j]=true;
}
}
}
}
void GetPrime()
{
for(int i = 2; i <= 431; ++i)
Prime[i] = true;
for(int i = 2; i <= 431; ++i)
{
if(Prime[i])
{
for(int j = i+i; j <= 431; j+=i)
Prime[j] = false;
}
}
num = 0;
for(int i = 0; i <= 431; ++i)
if(Prime[i])
Primer[num++] = i;
}
线性筛法:
#include<cstdio>
const int N = 100000 + 5;
bool prime[N];//prime[i]表示i是不是质数
int p[N], tot;//p[N]用来存质数
void init(){
for(int i = 2; i < N; i ++) prime[i] = true;//初始化为质数
for(int i = 2; i < N; i++){
if(prime[i]) p[tot ++] = i;//把质数存起来
for(int j = 0; j < tot && i * p[j] < N; j++){
prime[i * p[j]] = false;
if(i % p[j] == 0) break;//保证每个合数被它最小的质因数筛去
}
}
}
int main(){
init();
}
2.算术基本定理:
每个大于1的正整数n都可以表示成素数之积的形式 即:
n=【p1】^a1 【p2】^a2 【p3】^a3 【p4】^a4…..
设d(n)是n的正因子的个数,sum(n)是n的所有因子之和
d(n)=(a1+1)*(a2+1)*(a3+1)…
Sum(n)=(1+p1+p1^2+…+p1^a1)*(1+p2+p2^2+……+p2^a2)*….
3.同余问题
欧几里得原理:
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
扩展欧几里得原理:
Int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;return a;
}
int r=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return r;
}
4.逆元