一、gcd lcm
基础中的基础,一般用来处理计算第一步什么的,分数化简之类。
LL gcd(LL a, LL b)
{
return b ? gcd(b, a % b) : a;
}
<pre name="code" class="cpp">LL lcm(LL a, LL b)
{
LL c = gcd(a, b);
return a / c * b;
}
例题:
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
高次同余方程组:
中国剩余定理:
三、素数
也是第一步的处理。
例题:
poj 1811 + poj 2429 (Miller_Rabin大素数测试 + Pollard_Rho大合数分解)
四、快速幂
普通快速幂和矩阵快速幂。
用于求比较大的数的幂次取模。
比较大小可以取对数。
例题:
快速幂:
矩阵快速幂:
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
进阶:
六、因子相关
因子和,因子个数和,积性函数。
例题:
uva 10791 Minimum Sum LCM(拆分素因子)
七、fib与catalan
catalan:
h(n) = (4 * n - 2) / (n + 1) * h(n - 1)
经典的总结:http://www.cnblogs.com/wuyuegb2312/p/3016878.html
例题:
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)
九、java大数使用
十、数学问题+技巧
uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401
uva 106 Fermat vs. Pythagoras(勾股数求法)
uva 11029 Leading and Trailing(求n^k的前几位和后几位 证明)
十一、组合数学学习
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!) |