一、gcd lcm
基础中的基础,一般用来处理计算第一步什么的,分数化简之类。
LL gcd(LL a, LL b)
{
return b ? gcd(b, a % b) : a;
}
LL lcm(LL a, LL b)
{
LL c = gcd(a, b);
return a / c * b;
}
例题:
hrbust 1178
hdu 2028 Lowest Common Multiple Plus
二、exgcd
通常用于解二元一次方程,线性同余方程组,高次同余方程组(babystep_giantstep)。
中国剩余定理。
void exgcd(LL a, LL b, LL& d, LL& x, LL& y)//ax + by = d, d = gcd(a, b)
{
if (b == 0)
{
d = a;
x = 1;
y = 0;
}
else
{
exgcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
例题:
二元一次方程:
poj 1061 + poj 2115 + poj 2142
uva 10673 Play with Floor and Ceil
线性同余方程组:
poj 2891 Strange Way to Express Integers
hdu 1573
高次同余方程组:
poj 3243 poj 2417 hdu 2815
中国剩余定理:
poj 1006 Biorhythms
三、素数
也是第一步的处理。
例题:
hdu 2098 分拆素数和
poj 2689 Prime Distance 大素数
poj 1811 + poj 2429 (Miller_Rabin大素数测试 + Pollard_Rho大合数分解)
四、快速幂
普通快速幂和矩阵快速幂。
用于求比较大的数的幂次取模。
比较大小可以取对数。
例题:
快速幂:
uva 10006 Carmichael Numbers
poj 1995
矩阵快速幂:
poj 3233(矩阵快速幂)
hdu 3292 No more tricks, Mr Nanguo(矩阵快速幂解佩尔方程)
五、欧拉函数
小于一个数x且与x互素的数的个数,就是欧拉函数,保存在phi[x]中。
1.打表:
void phi_table()
{
for (int i = 2; i <= maxn; i++)
phi[i] = 0;
phi[1] = 1;
for (int i = 2; i <= maxn; i++)
{
if (!phi[i])
{
for (int j = i; j <= maxn; j += i)
{
if (!phi[j])
{
phi[j] = j;
}
phi[j] = phi[j] / i * (i - 1);
}
}
}
}
2.O(n)解法:
int euler_phi(int n)
{
int m = sqrt(n + 0.5);
int res = n;
for (int i = 2; i <= m; i++)
{
if (n % i == 0)
{
res = res / i * (i - 1);
while (n % i == 0)
n /= i;
}
}
if (1 < n)
res = res / n * (n - 1);
return res;
}
例题:
基础:
uva 10820 poj 2407 poj 1284 poj 2478 poj 3090
进阶:
poj 3696 + poj 3358
六、因子相关
因子和,因子个数和,积性函数。
例题:
uva 10791 Minimum Sum LCM(拆分素因子)
poj 1845 (因子和)
poj 2992 (因子个数和)
hdu 1452 (积性函数+因子和+乘法逆元)
poj 2480 (积性函数+素因子和)
七、fib与catalan
catalan:
h(n) = (4 * n - 2) / (n + 1) * h(n - 1)
经典的总结:http://www.cnblogs.com/wuyuegb2312/p/3016878.html
例题:
hdu 1023 Train Problem II
uva 10303 uva 991
fib:
通常的fib直接打个表或者乱搞一下。
但是fib有个扩展就是fib的矩阵形式,在要求fib比较大的情况下,直接用矩阵快速幂搞定。
⎡⎣⎢100111110⎤⎦⎥⎡⎣⎢Sn−1Fn−1Fn−2⎤⎦⎥=⎡⎣⎢SnFnFn−1⎤⎦⎥
例题:
uva 10229 (fib矩阵形式+矩阵快速幂)uva 10518 (fib(n)调用多少次)
八、概率论、组合数学
排列组合,贝叶斯公式、全概率公式。
例题:
uva 10105 uva 10910 uva 10943(排列组合C)
hdu 2048 and 2049(错排问题)
uva 19759 (Dp+概率)
uva 10900 (期望)
uva 10056(等比数列求和)
uva 11181(贝叶斯公式)
uva 10277 (概率论 + 暴力)
uva 10169 (概率+取小数点后0的位数)
九、java大数使用
uva 10183 uva 10519 uva 10516
十、数学问题+技巧
uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401
uva 11121 Base -2 (负进制计算)
uva 128 Software CRC(进制转换)
uva 106 Fermat vs. Pythagoras(勾股数求法)
uva 11029 Leading and Trailing(求n^k的前几位和后几位 证明)
poj 1091 跳蚤(n元一次不定方程+斥容原理)
uva 11027(康拓展开求序列|编码解码)
uva 10491 (广义三门问题)
poj 1695 (莫比乌斯反演)
十一、组合数学学习
1.排列组合:
Type | Sample | Order Counts? | Rep? | Numbers of ways |
无重组合 | 从n个球中取r个 | No | No | C(n,r) |
无重排列 | 从n个人中找r个排队 | Yes | No | P(n,r) |
可重组合 | 从n种水果中选r个拼果篮 | No | Yes | C(n + r - 1, r) |
可重排列 | n个字母组成的r位串 | Yes | Yes | n ^ r |
多重全排列 | r1个a,r2个b组成的n位串 | Yes | Yes | n! / (r1! r2!) |