我 对 数论的学习

来源:互联网 发布:最出名的网络作家 编辑:程序博客网 时间:2024/05/21 07:51

数论:

题不在多,在精

数论里面的东西有很多,我现在在我的这篇博客中 先对我所理解的,还有做题能碰到的做个小总结。

一:欧几里得算法

1:求最大公因数:

ll gcd(ll a,ll b){   return a%b==0?b:gcd(b,a%b);
}
他的思想则是利用辗转相除法求。

2:扩展欧几里得

先不看代码本身。

我们先要了解一个问题。就是 对 数字 a,b;

一定存在 x,y;

使得 x*a + y*b = gcd(a,b);

而扩展欧几米得的问题就在于 求这个x,y的值;

当然可以保证求的 x 和 y 的 绝对值是 最小的;

正负还是不好说的。

void exGcd(ll a,ll b,ll &x,ll &y){    if(b==0)    {        x=1;y=0;        return;    }    exGcd(b,a%b,y,x);    y-=a/b*x;}
如果说要你求 x 的最小正整数,然而x为负。

那么 你要知道 的就是 b*a - a*b=0;

我让x=x+b;

(x+b)*a + (y-a)*b = gcd(a,b);

给个例子 窜松门

美滋滋。

3:中国剩余定理

这玩意 ,我认为首先要引入一个东西叫做

韩信点兵;

相当于 有N个人

N mod(5)=4;

N mod(3)=2;

N mod(7)=1;

让你求最小。

首先分析问题 

除数互质

x ≡ 1 (mod 3)               x ≡ 0 (mod 3)            x ≡ 0 (mod 3)

x ≡ 0 (mod 5)               x ≡ 1 (mod 5)            x ≡ 0 (mod 5)

x ≡ 0 (mod 7)               x ≡ 0 (mod 7)            x ≡ 1 (mod 7)


求出x1 x2 x3;

x1 =70 ; x2 =  21 ; x3= 15;

那么有一个解 就一定是 70*2 + 21 *4 +15 *1=140+84+15=239;

我再对 5,3,7 的最小公倍数 取余。

239 mod 105 = 29;

这是一种 思路 ;

说实话 百度上的欧几里得 说的太专业 ,不怎么听得懂。

用这个例子,我觉的应该可以解决 一些问题。

接下来的话,我只需要通过 扩展欧几里得算法来分别求出x1,x2 ,x3;

美滋滋。

4:扩展中国剩余定理

中国剩余定理只是用于解决 除数互质的情况;

如果除数他们有共因子,就GG;

这个话题我好像还不是很懂。以后再来补;

给个 题目  窜松门



这是从别人的理解里搞过来的,对于我不是数学系的,我觉得,先存着吧;

好货以后万一有用也是美滋滋。

不过这玩意我还是用题目来记模版比较好。

到时候再发题目链接吧。

二:取模的相关运算

a + b mod c = (a mod c + b mod c)mod c 

a- b mod c - >  b =-b来理解。

a*b mod c  =  (a mod c)*(b mod c) mod c;

至于 a/b 情况不同 ;一般来说 我们可以通过求b 关于 mod c 的乘法逆元。

如果你不懂 乘法逆元 ,大兄弟 百度吧。

至于乘法逆元嘛;

这是我wa多次才发现需要的东西。

乘法逆元的求法:

1:费马小定理:

 怎么说呢  如果 a 与 p 互质;那么

   a^(p-1) ≡1(mod p)

那么这个有啥子用呢;

我们要求的是乘法逆元;

求的就是

(a^(p-2)  *  a)  mod p ==1

然后用快速幂在搞一下, 就求出了;

2:扩展欧几里得:

a 与 p 互质

那么 x*a  mod p*y == 1;

把这个x搞出来就行;

3:欧拉函数 :

这个就是 a 与 p 不互质的时候 所要利用的知识点;

不会;先存着以后变聪明了再来看;

三:组合数

高中的排列组合;

Cn(m);

写的不好看,凑合凑和,在n个东西中 选m个东西出来。

一般来说 解法就是 n!/(m! * (n-m)!);

小心别数据爆就行;

但是 啊;

我们要提前对n!

进行预处理的是吧;

n<1000000; 还好讲的是吧;

太大了怎么搞;

就需要一个定理 叫做,卢卡斯定理


骚不骚,必须骚;

代码实现:

int Lucas (ll n , ll m , int p) {  return m == 0 ? 1 : 1ll*comb (n%p , m%p , p) * Lucas (n/p,m/p,p)%p ;}
记得吧;




原创粉丝点击