数论学习(一)
素数筛法 //注意i*i可能会爆int,故用long long。
void get_prime(int n)
{
mset(visit, 0);
cnt = 0;
for(int i = 2; i <= n; i ++){
if(!visit[i]){
prime[cnt++] = i;
for(long long j = (long long)i * i; j <= n; j += i) visit[j] = 1;//注意long long
}
}
}
最大公约数
ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
最小公倍数 // 注意必须先除再乘,不然爆int,最小公倍数容易灰常大的。通常用long long
ll lcm(ll a, ll b)
{
return a / gcd(a, b) * b;
}
中国剩余定理
令任意固定整数为M,当M/A余a,M/B余b,M/C余c,M/D余d,…,M/Z余z时,这里的A,B,C,D,…,Z为除数,除数为任意自然数(如果为0,没有任何意义,如果为1,在孙子定理中没有计算和探讨的价值,所以,不包括0和1)时;余数a,b,c,d,z为自然整数时。
1、当命题正确时,在这些除数的最小公倍数内有解,有唯一的解,每一个最小公倍数内都有唯一的解;当命题错误时,在整个自然数范围内都无解。
2、当M在两个或两个以上的除数的最小公倍数内时,这两个或两个以上的除数和余数可以定位M在最小公倍数内的具体位置,也就是M的大小。
3、正确的命题,指没有矛盾的命题:分别除以A,B,C,D,…,Z不同的余数组合个数=A,B,C,D,…,Z的最小公倍数=不同的余数组合的循环周期.