ACM总结 数论
文章平均质量分 75
yerongsc
这个作者很懒,什么都没留下…
展开
-
欧几里得扩展算法
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。void extendGcd(__int64 a,__int64 b,__int64 &x,__int64 &y){if(b==0){x = 1;y = 0;return;}extendGcd(b,a%b,x原创 2013-04-04 18:15:29 · 414 阅读 · 0 评论 -
LightOJ 1333 结构体排序
题目大意就是求出每一列的颜色组合数之积,一个不可涂色的方块等同于将一列分成2列,开始对不可涂色的方块进行列排序,在进行行排序,对每一个方块进行处理即可。结构体排序采用sort函数即可#include #include #include #include using namespace std;#define i64 long longstruct B原创 2013-04-13 21:50:08 · 1075 阅读 · 0 评论 -
1375 - LCM Extreme
思路:S(n)=sigama(LCM(n, i)) (1 =n*sigama(i/Gcd(n,i)) =n*sigama(d|n{sigama(i|Gcd(n,i)=d)}/d)而sigama(i){Gcd(n,i)=d}=d*sigama(i|Gcd(n/d,i)=1)所以上式=n*sigama(d|n,sigama(i|Gcd(n/d,i)=转载 2013-04-14 21:59:19 · 614 阅读 · 0 评论 -
数论所以常用模板
#define i64 long long//求a^b%modi64 POW(i64 a,i64 b,i64 mod){ i64 ans=1; while(b) { if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans;}转载 2013-04-12 22:08:16 · 455 阅读 · 0 评论 -
Lucas 定理 模板
C(m,n)% mod = C(m1,n1)* C(m2,n2) * .....*C(mp,np)%modm = m1*mod^k+m2*mod^(k-1)+...+mpn = n1*mod^k+n2*mod^(k-1)+...+np将m,n换位mod进制#include #include #include usingnamespace std;ty转载 2013-04-12 20:48:17 · 779 阅读 · 0 评论 -
LightOJ 1282 求n^m的高三位和低三位
低三位用2分法对1000取模即可高三位先将n^m转为科学计数法p.q*10^tlog(10,n^m) = log(10,p.q*10^t),m*log(10,n) = t+log(10,p.q);m*log(10,n)的整数部分对应t,小数部分对应log(10,p.q),即可以求出p.q将p.q的前三位有效数字取出即为高三位#include #include #i原创 2013-04-11 23:25:54 · 1234 阅读 · 0 评论 -
LightOJ 1278 一个固定数可以换为几个连续数之和 求这样的连续数有多少对
题目:http://www.lightoj.com/volume_showproblem.php?problem=1278若m能够转为连续n个整数的和,即(x+(x+n-1))*n/2=mx = (2*m/n-n+1)/2即2*m/n-n为奇数,当n为奇数时,其值一定为奇数,当n为偶数时,2*m/n必为奇数,令p = 2*m/n,x = p- 2*m/p,p为奇数。即该原创 2013-04-11 22:05:39 · 466 阅读 · 0 评论 -
LightOJ 1245 求(n/1+n/2+...+n/n)
先求出前sqrt(n)项和:即n/1+n/2+...+n/sqrt(n)再求出后面所以项之和.后面每一项的值小于sqrt(n),计算值为1到sqrt(n)的项的个数,乘以其项值即可快速得到答案例如:10/1+10/2+10/3+...+10/10sqrt(10) = 3先求出其前三项的和为10/1+10/2+10/3在求出值为1的项的个数为(10/1-10/2)个,分别是(10原创 2013-04-10 23:18:21 · 978 阅读 · 0 评论 -
LightOJ 1236 求满足最小公倍数为n的序列对(a,b)
设n = a1^p1*a2^p2*a3^p3*......*an^pn.(a1,a2,..an为质因子)若a,b的最小公倍数为n,则a,b中一定含有因子a1^p1||a2^p2||a3^p3||....an^pn,否则最小公倍数一定小于n如果假设a含有因子a1^p1,对于b的a1项可以取(a1^0,a1^1,....,a1^p1),反之,若b含有因子a1^p1,a中a1项可取(a1^0,a原创 2013-04-10 22:27:36 · 608 阅读 · 0 评论 -
LightOJ 1138 给出数字n,求m使得m!的末尾含有n个0
n!中末尾含0的个数即为1,2,……,n中含有的5的个数,25含有2个5,125含有3个5。因为5的个数>2的个数。5*2=10.从(a,b)使用2分法,每次求出((a+b)/2)!中5的个数,若其个数大于n,使b = (a+b)/2,若小于n,使a = (a+b)/2直至求出一个值与n相等。#include #include #include using namespac原创 2013-04-09 20:54:17 · 561 阅读 · 0 评论 -
LightOJ 1098 前n个数的所有约数求和
对于前n个数的约数求和,求出当约数为从2到sqrt(n)时,每个约数的个数,再求出当约数个数为2到sqrt(n)时所有约数的和。假设对100以内的每个数的所有约数求和2,3,4,5,6,7,8,9,10,每个约数出现的次数是100/i(i=2,3,...,10).当约数为11时,出现次数为100/11,约数为12时,12出现次数为100/12.因此区间(100/9,100/8]中的整数为出原创 2013-04-07 23:54:22 · 1102 阅读 · 0 评论 -
LightOJ 1067 组合数求模
由于n的值较小(10^6以内),mod = 1000003,使用乘法逆元和阶乘预处理即可。c(m,n) = m!/(n!*(m-n)!)对阶乘进行求模预处理,对分母求其乘法逆元,将得到的乘法逆元与分子相乘求模即可#include #include #include using namespace std;int const mod = 1000003;原创 2013-04-07 20:19:21 · 734 阅读 · 0 评论 -
LightOJ 1045 求N!的位数
N!一般是不可解的,所以在求取N!的位数时采用对数的思想方法,log(n!) = log(n)+log(n-1) + log(n-2) +...+log(2)#include #include #include using namespace std;double sum[1000001];void init(){ for(int i原创 2013-04-06 19:26:42 · 483 阅读 · 0 评论 -
LightOJ 1054 求n^m%mod
任意数n可以写成 n = p1^k1 * p2^k2 * p3^n3 * ....* pn^kn(p1,p2,...pn为质因数)n^m 的约数 一定是 p1^m1 * p2 ^m2 *p3^m3 *....* *pn^mn (m1所以约数的和为(p1^0+p1^1+.....+p1^(m*k1))*(p2^0+p2^1+...+p2^(m*k2))*......*(pn^0+p原创 2013-04-06 23:57:55 · 617 阅读 · 0 评论 -
LightOJ 1028 求n的因子的个数
P = p1^n1*p2^n2*......*pn^nn数P的因子的个数 = (n1+1)*(n2+1)*.....*(nn+1)p1,p2,p3,....pn为P的质因数首先求出1000000以内的素数,再计算每个质因数的个数#include #include long long prime[1000001];long long trueprime[10000原创 2013-04-06 18:02:58 · 624 阅读 · 0 评论 -
LightOJ 1104解题报告 求大数的所有约数
将大数的开方作为循环的终点,从0到大数的开方进行循环,用2个数组保存大数的约数。#include #include unsigned int a[65535];unsigned int b[65535];int main(){unsigned int p,l,k1,k2,i,n;unsigned int q;int j;scanf("%u",&n原创 2013-04-05 23:45:44 · 766 阅读 · 1 评论 -
uva 10534 Wavio Sequence
先正向求起点每个位置最长上升子序列,再反向求终点到每个位置的最长上升子序列,则以每个点为中心的序列长度为该点正向上升子序列和反向上升子序列中较小的值(比如1 2 6 8 7 8第4个位置的正向上升子序列长度为4,反向上升子序列长度为3,则该点的序列长度为2*3+1),如果该点的值比前面的一个值大,则该点的长度为上一个点的长度+1,上诉序列中 2比1 大 第2点的长度是2 同原创 2013-04-05 20:30:28 · 372 阅读 · 0 评论 -
LightOJ 1336 Sigma Function 求前n个数中约数和为偶数的数的个数
约数和的公式sum = (p1^0+p1^1+...+p1^m1)*(p2^0+p2^1+....+p2^m2)*....*(pn*0+pn^1+....+pn^mn);约数和为偶数 即当素因子为奇数时,其最高次幂一定为偶数 当素因子为2时,2^0+2^1+...+2^n一定为奇数当素因子为3时,3^0+3^1为偶数,3^0+3^1+3^2为奇数所以本题首先筛选出10^12以内原创 2013-04-14 14:23:49 · 1061 阅读 · 0 评论