数论入门整理(updating)

本文介绍了数论的基础知识,包括gcd与lcm的计算,exgcd用于解线性方程,素数处理,快速幂算法,欧拉函数,因子相关问题,Fibonacci数列和Catalan数,概率论与组合数学的应用,以及Java大数操作。通过实例题目展示了这些概念的实际应用。
摘要由CSDN通过智能技术生成

一、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;
}
 

例题:

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比较大的情况下,直接用矩阵快速幂搞定。

        100111110Sn1Fn1Fn2=SnFnFn1


例题:

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.排列组合:

TypeSampleOrder Counts?Rep?Numbers of ways
无重组合从n个球中取r个NoNoC(n,r)
无重排列从n个人中找r个排队YesNoP(n,r)
可重组合从n种水果中选r个拼果篮NoYesC(n + r - 1, r)
可重排列n个字母组成的r位串YesYesn ^ r
多重全排列r1个a,r2个b组成的n位串YesYesn! / (r1! r2!)



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值