首页 > 代码库 > 数论小结1.
数论小结1.
从白书上面的习题开始版切....但是发现时间不够了....
今天粗略的做了不少题目.....但是有些题目感觉实在是比较诡异.......感觉考的话也不太可能...不过还是写下来吧.
1.Uva 10673
已知x, k, 求 x = p * floor(x / k) + q * ceil(x / k).的解.
思路:
其实分类讨论就 ok 了. 当 x % k == 0 时, 取 p = x * k, q = 0;
否则, floor 与 ceil 相差 1. 怎么做? 你懂得.
2. Uva 11768
求 AB 线段上的整点的个数...(坐标为 0.1 的倍数.)
思路:
标准做法和我一开始想的暴力搞法是一样的.....
暴跳直到跳到整点为止.......(感觉非常的不科学.)
然后,我们就直接 gcd 就 ok 了.(为什么网上的人的代码都那么长一个个?)
3. Uva 11728
求一个最大的数N, 使得这个数的因子之和为S (S <= 1000)
思路:
呵呵, NOIP的暴力题.S <= 1000所以N <= 1000....O(N^2)可做.
4. Uva 10692
求 a1 ^ a2 ^ a3 ^ a4 ... ^ an % m 的值.(n <= 10)
思路:
这个才是数论的题目....
这个方法的证明我看不懂....数学蒟蒻...
不过结论是这样的. a ^ x = a ^ (x % m + m) (mod m).
这个问题显然是可递归的, 加上快速幂就 ok 了.
5. Uva 01426
已知一个数的一个离散平方根, 求一个数所有的离散平方根. 定义为: r ^ 2 = x (mod n) 则 r 为 x 在 模 n 意义下的离散平方根.
思路:
这个是好题,
已知的平方根的 r1, 未知的为 r2.
则:
r1 ^ 2 = x + k1 * n.
r2 ^ 2 = x + k2 * n.
两式相减:
r1 ^ 2 - r2 ^ 2 = (k1 - k2) * n
整理得:
(r1 + r2) * (r1 - r2) = k3 * n.
如果令 A * B = n (非常的精妙!)
则 r1 + r2 = 0 (mod A) && r1 - r2 = 0 (mod B) ¹
或 r1 - r2 = 0 (mod A) && r1 + r2 = 0 (mod B)
我们先讨论 ¹ 式.
两式相加, 得到 2 * r1 = p * A (mod B).
也即: p * A = 2 * r1 (mod B).
显然这个东西是能够用 exgcd 求出所有的解的.
对于 exgcd 求出的是满足 p * A + q * B = gcd(A, B).
的解.
令 d = gcd(A,B), 显然, 如果 2 * r1 % d != 0 方程是无解的.
否则这个方程的第一个可行解就是 p = x0 * (2 * r1) / d.(x0 是 exgcd 求出来的解.)
带回 ¹ 即可求得另外一个解.
参见线性模方程的通解表达式. x = x0 + i * (B / d). 那么 p = ( x0 + i * (B / d) ) * (2 * r1) / d.
分析一下复杂度, 因为线性模方程的解的个数为 O(gcd(A,B)) 个, 所以 极限情况下是 sqrt(N) 的.
用 set 哈希一下就 ok 了.
6. Uva 01415
问一个数是否是高斯素数, 高斯素数的定义即是这个数不能被分解成两个高斯整数的乘积...
关于高斯整数的定义: 参见 Wikipedia.
思路:
我觉得这个道题简直就是在乱搞,尤其是样例解释都不太符合高斯整数的定义?
唯一的收获就是费马平方和定理.... 一个奇质数能被拆分成两个数的平法和的充要条件是 p % 4 = 1.
为什么不是偶质数? 呵呵, 因为偶质数只有2........
≡
<style></style>≡
数论小结1.