随笔分类 -  数论

摘要:卡特兰数 转自http://blog.163.com/lz_666888/blog/static/1147857262009914112922803/ Catalan数 中文:卡特兰数 原理: 令h(1)=1,h(0)=1,catalan数满足递归式: h(n)= h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=2) 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1); 该递推关系的解为: h(n+1)=C(2n,n)/(n+1) (n=1,2,3,...) 我并不关心其解是怎么求出来的,我只想知道怎么... 阅读全文
posted @ 2012-08-08 09:06 沐阳 阅读(321) 评论(0) 推荐(0)
摘要:这题虽说解题报告中说的是简单题,但比赛中AC率以及提交量并不是很高,主要是数据范围太大,有点吓人,而且含有trick。题目给定b,p,M 问 0 <= n <= M 中有多少个数满足 n^(n!) ≡ b (MOD p),并且可恶的是这里没有提到任何数的特殊性质,给定都只是限定在正整数且p>0。有欧拉定理我们知道 n^(phi(p))≡ 1 (mod p) 但是这里要求gcd(n, p) = 1,显然题目并没有这么要的数据,那么如果题目给定是满足n,p互质的话,那么我们就可以知道n^(x) mod p 是有循环节的,这个循环节就是n^(phi(p)),如果n,p不互质的话,那 阅读全文
posted @ 2012-08-07 10:46 沐阳 阅读(907) 评论(1) 推荐(0)
摘要:转自http://www.cnblogs.com/suno/archive/2008/02/04/1064368.html利用积性函数的优化.这个文章主要介绍了3算法1线性时间筛素数2线性时间求前n个数的欧拉函数值3线性时间求前n个数的约数个数一、首先介绍下积性函数。下面是wiki的条目:在非数论的领域,积性函数指有对于任何a,b都有性质f(ab)=f(a)f(b)的函数。在数论中的积性函数。对于正整数n的一个算术函数f(n),当中f(1)=1且当a,b互质,f(ab)=f(a)f(b),在数论上就称它为积性函数。若某算术函数f(n)符合f(1)=1,且就算a,b不互质,f(ab)=f(a)f 阅读全文
posted @ 2012-08-06 18:47 沐阳 阅读(1077) 评论(0) 推荐(0)
摘要:本文转自http://blog.sina.com.cn/s/blog_694034130100wlrh.html(修改了少量有误的地方)欧拉函数:对于一个正整数n,小于n且和n互质的正整数的个数,记做:φ(n),其中φ(1)被定义为1,但是并没有任何实质的意义。特殊性质:当n为奇数时,φ(2n)=φ(n)。完全余数集合:定义小于n且和n互质的数构成的集合为Zn,称呼这个集合为n的完全余数集合。显然,对于素数p,φ(p)= p - 1.对于两个素数p、q,他们的乘积n = pq 满足φ(n) =(p-1)(q-1)证明:对于质数p,q,满足φ(n) =(p-1)(q-1)考虑n的完全余数集Zn 阅读全文
posted @ 2012-08-06 14:33 沐阳 阅读(1205) 评论(0) 推荐(1)
摘要:阶乘末尾0的个数有一个题目说的是求 100 的阶乘末尾有多少个 0. 题解中给出的讲解提到, 一个数 n 的阶乘末尾有多少个 0思路:一个数 n 的阶乘末尾有多少个 0 取决于从 1 到 n 的各个数的因子中 2 和 5 的个数, 而 2 的个数是远远多余 5 的个数的, 因此求出 5 的个数即可. 题解中给出的求解因子 5 的个数的方法是用 n 不断除以 5, 直到结果为 0, 然后把中间得到的结果累加. 例如, 100/5 = 20, 20/5 = 4, 4/5 = 0, 则 1 到 100 中因子 5 的个数为 (20 + 4 + 0) = 24 个, 即 100 的阶乘末尾有 24 个 阅读全文
posted @ 2012-08-06 08:34 沐阳 阅读(2254) 评论(0) 推荐(1)
摘要:首先这题可以用期望DP来计算最后的期望值,由于这题每张卡片对应的概率是不相同的,所以不能像POJ-2096那样dp[i]表示拿到了i 张卡片来表示状态,而是要开一个 1<<N的状态来压缩状态表示拿到不用的卡片的期望值。对于给定的N,我们有dp[(1<<N)-1]=0,因为这已经是最后的状态了。对于dp[i] 我们需要分析其能够到达的状态,如果 N=6, i 的二进制位为 011011,那么可能买零食不改变原来状态,也就是中了已经有了的卡片或者是没有中卡片,所以到达原来状态的概率是p[1]+p[2]+p[4]+p[5]+NONE,这一项是要移到待会儿方程的左边去解的,因为 阅读全文
posted @ 2012-08-04 22:19 沐阳 阅读(1226) 评论(0) 推荐(1)
摘要:这题比赛的时候纠结了不少...对于A进制的一个数,先将其左移N位使得其成为一个整数,然后再将这个整数化为B进制的一个数,然后我们只需要考虑这个数是否能够整除A^N即可(因为我们前面左移了N位),我可以将B进制的这个数先进行左移无限位,那么当有A^N 整除 B^INF 时我们就可以将这个除尽,然后我们再将B右移INF位便可以了。这里就把问题转化为了A^N能够整除B^INF进制了,进一步我们可以得到B包含所有A的质因子便为判定条件了。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#includ 阅读全文
posted @ 2012-08-01 09:50 沐阳 阅读(537) 评论(0) 推荐(0)
摘要:这题首先要将等式两边除以k,这样在求两边的互质数的个数就是最后的结果了。我们采用的策略就是用小区间的每一个数去匹配大区间的数。但是如果每次都去分解一个数的质因子的话,那么会TLE,因此先预处理出1-100000每个数的质因子再进行计算。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;int a, b, c, d, k, rec[300000], idx;in 阅读全文
posted @ 2012-07-29 11:09 沐阳 阅读(301) 评论(0) 推荐(0)
摘要:将与N不互质的数全部找出来,再应用容斥定理求得最后的结果。这题在求 a/b MOD c 的时候使用费马小定理等价于 a*b^c(-2) MOD c.用x/lnx 可以估计出大概有多少素数。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#define MOD 1000000007LLusing namespace std;typedef long long int Int64;typedef lo 阅读全文
posted @ 2012-07-28 23:55 沐阳 阅读(326) 评论(0) 推荐(0)
摘要:这题简单说就是求矩形的面积并,线段树?只有20个矩形,我们可以用容斥来做。但是这个有个比较麻烦的地方就是要求出任意组合情况下的面积并,试过几次每次进行求解的写法都一一超时了。这里选择在dfs的时候直接枚举题目将询问的状态,只要当前状态是其子集的话,就直接加到上面。最后M次询问就能够在O(1)的时间内完成了。296MS水过了。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>#define INF 10000using namespace st 阅读全文
posted @ 2012-07-28 20:26 沐阳 阅读(737) 评论(0) 推荐(0)
摘要:红果果的容斥定理。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int ans, seq[15], N, flag;int M;inline int GCD(int a, int b){ int t; while (b) { t = a; a = b; b = t % b; } return a;}inline int LCM(int a, int b) { return a... 阅读全文
posted @ 2012-07-28 10:08 沐阳 阅读(207) 评论(0) 推荐(0)
摘要:该题就是给定一个数,求某个区间内有多少数与这个数互质。首先我们要明确,对于一个给定的区间,我们如果能够求出这个区间内所有与其不互质的数的个数的话,那么互质数的个数也就求出来。这个叫做反面求解。对于任何一个正整数N,都有其唯一的素因子分解形式,我们可以这样想,任何与N不互质的数一定是其某一个质因子的倍数,所以我们通过某一个质因子能够确定一个范围内的有多少个数该质因子的倍数的数。但是这并不是所有不互质数的充分条件,对于另外的质因子同样满足能够确定一系列的数,我们要做的就是融过容斥定理求他们的并集。代码如下:#include <cstdlib>#include <cstring&g 阅读全文
posted @ 2012-07-28 10:07 沐阳 阅读(551) 评论(0) 推荐(0)
摘要:一个需要进行转化的题目。x = (n*(n+k))/k = n*n/k + n,最后求小于等于N且是N^2的因子的数的个数。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <cmath>#include <map>using namespace std;int N;map<int,int>mp;map<int,int>::iterator it;int fun(){ int ret = 1; for (it = mp.begi 阅读全文
posted @ 2012-07-25 12:01 沐阳 阅读(265) 评论(0) 推荐(0)
摘要:这题竟然用java也可以过,因该算是最简单的吧了。当然另外的两重for循环的写法也算是很简单的了。这里就直接写素因子分解的写法。对于A中的数,我们可以将每个数都进行素因子分解,最后保留各个质数的指数,对B进行同样操作,然后在去两者指数的min值就可以了。这里要对大质数进行特殊处理。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <map>#define MOD 1000000000using namespace 阅读全文
posted @ 2012-07-24 00:39 沐阳 阅读(435) 评论(0) 推荐(0)
摘要:这题是一道非常直接的中国剩余定理的题目,但是这里的不同的给定的几个数不一定是互质的。因此也就不能直接用解中国剩余定理的方法来求了。我们通过迭代法来求解最后的答案。设有 x = 1(mod 5) y = 2(mod 6) z = 3(mod 7)那么根据第一个方程我们设 x = 5t+1, 代入到第二个方程 5t+1 = 2(mod 6) ==> 5t -6u = 2-1 左边这个式子就可以用扩展GCD求出t的解,我们知道t的解由两部分组成,一部分是我们解出来的一般解5(必须保证为最小的正整数),此时u等于4,另外的就是加上 k 个 6 / gcd(5, 6)了,那么我们可以得到 t =. 阅读全文
posted @ 2012-07-21 18:08 沐阳 阅读(348) 评论(0) 推荐(1)
摘要:这题就是一个简单扩展GCD,方程为 x*C + y * 2^k = B-A.代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>using namespace std;typedef long long int Int64;Int64 A, B, C, K;Int64 _pow(Int64 a, Int64 b){ Int64 ret = 1; while (b) { if (b & 1) { ret *= a; } ... 阅读全文
posted @ 2012-07-21 15:44 沐阳 阅读(233) 评论(0) 推荐(0)
摘要:中国剩余定理说白了就是小学时候的韩信点兵的完全版。给定一系列数,给定条件是一个数MOD这一些列数的结果,问你最后这个数最少为多少。抽象出来就是N个同余方程,利用扩展GCD就可以求得这一结果,本题给定的数都是互质的,因此处理起来就简单了。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>using namespace std;int b[4], D;int ext_gcd(int a, int b, int &x, int &y){ int ret, temp; if (b == 阅读全文
posted @ 2012-07-21 12:24 沐阳 阅读(197) 评论(0) 推荐(0)
摘要:该题题意就是求一个数最多能够开多少次方,这其中包含有负数,而且要用long long 型数据读入。首先将这个数的素因子分解求出,统计出它们的各自的个数,然后对它们的个数求一个gcd,最后输出。如果是正数的话直接输出,如果是负数的话需要将其的最大奇因子求出。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;int p[66000], cnt;long long 阅读全文
posted @ 2012-07-14 22:04 沐阳 阅读(400) 评论(0) 推荐(0)
摘要:Number SequenceTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 43278Accepted Submission(s): 9449Problem DescriptionA number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.Given A, B, and n, you are to 阅读全文
posted @ 2011-09-04 00:13 沐阳 阅读(10179) 评论(0) 推荐(3)
摘要:简单点说题目就是要求连个分数的最小公倍数,这个题目上次在参加比赛时遇到过,不过那时候是用很暴力的方法过的。本来上次我们已经推出来是求两个最简形式分数的分母的最小公倍数以及分母的最大公约数,不过就是A不掉,不过还好这次过掉了,方法论证是没错的。 对于两个最简的分数a / b, c / d 把他们两个的最小公倍数 x / y 也设为一个分数形式,那么这个 x 一定能够整除 a , c, y 一定能够被b , d整除。那么要求得最小公倍数,那么肯定是分子尽量小,即 a , c 的最小公倍数, 分母尽量大, 即 b , d 的最大公约数。 代码如下: 1 #include <stdio.h> 阅读全文
posted @ 2011-08-28 09:30 沐阳 阅读(1339) 评论(0) 推荐(0)