数论
文章平均质量分 72
iwtwiioi_2
闪耀无比灿烂的光芒,超越极点。
与其做一棵绿洲上的小草,不如做一棵沙漠中的大树。
展开
-
【wikioi】1012 最大公约数和最小公倍数问题
题目链接算法:数论(辗转相除)gcd(a, b)是a和b最小公倍数, lcm(a, b)是a和b的最大公倍数gcd(a, b) == gcd(b, a%b)lcm(a, b) == a/gcd(a, b)*b //不用a*b/gcd(a,b)是为了防止溢出一般枚举算法//暴力枚举即可//只不过gcd(a, b) == gcd(b, a%b); lcm(a,原创 2013-10-20 15:58:50 · 838 阅读 · 0 评论 -
1^b+2^b+3^b+...+n^b数列
(听说高中有,但是我还没看,所以就自己推了下)要算b次的,那么就要先算b+1次的。首先,我用F(i, j)表示杨辉三角第i层第j个,即(a+b)^(i-1),i>1的展开各项系数第1层:1第2层:1 1 ((a+b)^1)第3层:1 2 1 ((a+b)^2)第4层:1 3 3 1 ((a+b)^3)....那么,(n+1)^b展原创 2013-11-02 19:05:48 · 1262 阅读 · 1 评论 -
快速幂
其实很好理解的,O(lg b)的时间复杂度,b是指数点我打开百科链接我就大概说一下。如果b = 11, 那么对应的二进制为1011,即答案11的二进制是101111 = 2³×1 + 2²×0 + 2¹×1 + 2º×1那么就刚好一一对应上代码(如果没有mod,数据很大,就要开高精度):unsiged long long fastpow(unsigned原创 2013-11-03 16:16:30 · 441 阅读 · 0 评论 -
最大公倍数和最小公倍数
最大公约数(欧几里德算法or辗转相除法)我们用gcd(a, b)表示a和b的最大公约数,那么gcd(a, b) = gcd(b, a%b)时间复杂度: O(lgb)具体证明很多的,百度即可。代码:int gcd(int a, int b){ return (b?gcd(b, a%b):a);}(非递归版自己推)最小公倍数:我们用lcm(a,原创 2013-11-04 12:17:23 · 848 阅读 · 0 评论 -
分解质因数和求因数个数
一个正整数N>1,必定可以分解为若干质因数相乘,即N=2^x1*3^x2*...*prime^xi,prime分解时一步步求N mod i , 2代码:int i = 1;while(n > 1){ i++; while(!(n % i)) //要一直分解下去 { n /= i; cout << i; if(n != 1) cout << "*"; }}原创 2013-11-05 18:41:50 · 4728 阅读 · 0 评论 -
筛质数
常用的有2种算法,分别有不同的用途。1、暴力枚举 O(sqrt(n)) 常用于判断单个或少量数是否质数2、一般的线性筛 O(n^2) 常数挺小,常用于O(1)查找是否质数,但需要开O(n)大小的数组3、快速线性筛(欧拉筛) O(n),虽然代码表面上看起来时间复杂度并不是O(n)实现:1、暴力枚举代码:ok = 1;for(i = 2; i <= sqrt(n)原创 2013-11-05 23:10:31 · 762 阅读 · 0 评论