当前位置:
文档之家› 国际大学生程序设计竞赛数论与算法.ppt
国际大学生程序设计竞赛数论与算法.ppt
分析: 显然X1为分子,X2比为分母,其它数可以为分子
也可以为分母。
方法一:将分母X2分解质因数,由于 X2≤1000000000,所以质因数个数不超过29 个。逐一扫描X1,X3,X4…,Xk,看能否将 X2约掉。
方法二:还是逐一扫描X1,X3,X4…,Xk, 看能否将X2约掉,但不进行因数分解,而是 每次约掉它和X2的最大公约数。
数论基本知识
1。如何求出1~n中的所有素数? Eraosthenes氏筛法:每次求出一个新的素数,就把n以内的它的所有
倍数都筛去。 2。给出一个数n,如何判断它是不是素数? 1)朴素的判别法 从2开始试除小于n的所有自然数,时间复杂度为
O(n). 2) 如果a是n的因子,那么n/a也是n的因子,所以如果n有一个大于1
分析:把数字1,2,3,4从中抽出,然后把其他数 字按照原顺序排列组成的自然数w,w×10000整除 7取余有7种可能,即是0,1,2,3,4,5,6。如 果能把1,2,3,4排列出7个数,使它们整除7取余 的值分别为0,1,2,3,4,5,6,把这4位数接在 w后面即为问题的解。
除法表达式
题目:除法表达式有如下的形式:X1/X2/X3/…/Xk.其 中Xi是正整数且X≤1000 000 000(1≤i≤k,k≤10 000)。除法表达式应当按照从左到右的顺序计算。 可以在表达式中嵌入顺序。现在给一个除法表达式 E要求告诉是否可以通过增加括号使表达式为E‘,E’ 是整数。
扩展的欧几里德算法
如果(a,b)=d,那么一定存在x,y满足ax+by=d。
Function extended_gcd(a,b:longint; Var x,y:longint):longint;
Begin
if b=0 then begin
extended_gcd:=a;
x:=1;
y:=0;
≡a(mod p),反过来,满足ap ≡a(mod p),p也 几乎一定是素数。
求ax≡b(mod n)所有解的算法 利用欧几里德辗转相除法, 模方程等价于存在整数y,使得ax-ny=b,时间复杂度为o (n+logb)。
Procedure modular_linear_equation(a,b,n:longint);
同余模算术
同余:a≡b( mod c) 性质1:同余关系是一个等价关系。 性质2:a≡a1,b ≡b1(mod m),则a+b ≡a1+b1,a-b
≡a1-b1,ab ≡a1b1(mod m). 性质3:若ac ≡bd,c ≡d(mod m), 且(c,m)=1,则a
≡b( mod m). 模m剩余等价类。和m互素的剩余等价类的个数记
整除基本性质有:
(1)若a∣b, a∣c,则a∣(b+c)
(2)若a∣b,则对所有整数c, a∣bc
(3)若a∣b, b∣c,则a∣c (传递性)
自反,反对称,传递性,偏序关系。< ∣,Z >是一个格。
素数(prime)和合数(compound),如果一个整数p只有1和p两个因 子,则p为素数,不为素数的其它数为合数。如果n为合数,则n必有一个 小于或等于n的平方根的数因子。
为f(m), 在和m互素的剩余类中各取一个代表元: a1,a2,a3,…,af(m).,它们组成m的一个缩剩余系。
关于f(m),有一下性质: 对于质数p,f(p)=p-1,f(pn)=pn(p-1). 若(m,m’)=1,f(mm’)=f(m)f(m’). Euler定理 若(k,m)=1,则kf(m) ≡1(mod m) 费马小定理 对于素数p和任意整数a,有ap
算术基本定理:每个正整数都可以唯一地表示成素数的乘积。其中素数 因子从小到大依次出现。
数论基本知识
除法的定义和同余 a=dq+r。 同余:a≡b(mod c) 最大公约数gcd(a,b) 最小公倍数lcm(a,b) ab=gcd(a,b)×lcm(a,b) 如果gcd(a,b)=1,则a与b互素。
国际大学生程序设计竞赛 --数论与算法 主讲:王树林
数论基本知识
信息学中应用的关于素数和整除的知识并不多,关键在于灵活应用。
素数和整除问题
如果a和b是整数,a≠0,若有整数c使b=ac,就说a整除b。在a整除b时, 记a是b的一个因子,b是a的倍数。用符号a∣b表示a整除b,a不能整除b 记为a ⊥b。
数论基本知识
Miller-Rabbin测试 function Miller-Rabbin(n:longint):boolean;
begin
for i:=1 to s do
Begin
a:=random(n-2)+2;
If modular_exp(a,n-1,n)<>1 then return false;
的真因子,则它必有一个不大于n1/2的因子,时间复杂度O(n1/2)。 等等。这些方法太慢。
伪素数:如果n是一个正整数,并且存在和n互素的正整数a满足an-1 ≡
1(mod n), 我们说n是基于a的伪素数。如果一个数是伪素数,它几乎肯 定是素数。另一方面,如果一个数不是伪素数,它一定不是素数。
end;
End;Βιβλιοθήκη return true;End;
这是一个概率型算法,属于Monte-Carlo算法系列。
时间复杂度为O(s×log3n)。
最大公约数的求法
欧几里德辗转相除法 function gcd(a,b:longint):longint; Begin if b=0 then gcd:=a; else gcd:=gcd(b, a mod b); End;
end else begin
extended_gcd:=extended_gcd(b, a mod b);
t:=x;
x:=y;
y:=t-(a div b) * y;
end;
End;
佳佳的困惑
题目:给出一个数N,含数字1,2,3,4,把N的 所有数字重新排列一下组成一个新数,使它是7的 倍数。
Begin
d:=extended_gcd(a,n,x,y);
If b mod d <> 0 then no_answer;