数论:研究整数规律
(待补充)
1.快速(模)幂
核心代码:
typedef unsigned long long ULL;
ULL powermod(ULL a, ULL n, ULL m)
{
ULL res = 1;
while(n) {
if(n & 1) { // n % 2 == 1
res *= a;
res %= m;
}
a *= a;
a %= m;
n >>= 1;
}
return res;
}
例题链接:
HDU1420 Prepared for New Acmer【数论 快速模幂】
2.素数判定
核心代码:
int isnotprime(int n)
{
if(n % 2 == 0)
return 1;
int end = sqrt(n), i;
for(i=3; i<=end; i+=2) {
if(n % i == 0)
break;
}
return i > end ? 0 : 1;
}
例题链接:
3.筛选法
例题链接:
4.模除
例题链接:
5.中国剩余定理(孙子定理)(同余方程)
例题链接:
POJ1006 UVA756 UVALive5421 Biorhythms【数论 中国剩余定理】
6.最大公约数、最小公倍数(GCD&LCM)
核心代码:
int gcd(int m, int n)
{
return n == 0 ? m : gcd(n, m % n);
}
int lcm(int m, int n)
{
return m / gcd(m, n) * n ;
}
例题链接:
AOJ0005 GCD and LCM【数论 GCD&LCM】
7.欧几里得算法
核心代码:
int gcd(int m, int n)
{
while(m>0)
{
int c = n % m;
n = m;
m = c;
}
return n;
}
例题链接:
51Nod-1011 最大公约数GCD【数论 欧几里得算法】
8.扩展的欧几里得算法
核心代码:
int exgcd(int a, int b, int &x, int &y)
{
if (a % b == 0) {
x = 0;
y = 1;
return b;
}else {
int r, tx, ty;
r = exgcd(b, a % b, tx, ty);
x = ty;
y = tx - a / b * ty;
return r;
}
}
例题链接:
UVA10104 Euclid Problem【数论 扩展欧几里得算法】
9.欧拉函数
核心代码:
/* 欧拉函数 */
int phi(int n)
{
int ret=1, i;
for(i=2; i*i<=n; i++) {
if(n%i == 0) {
n /= i;
ret *= i-1;
while(n%i == 0) {
n /= i;
ret *= i;
}
}
}
if(n>1)
ret *= n-1;
return ret;
}
例题链接:
UVA10179 Irreducable Basic Fractions【数论 欧拉函数】