数论
文章平均质量分 78
風吹过
这个作者很懒,什么都没留下…
展开
-
牛顿迭代法快速寻找平方根
下面这种方法可以很有效地求出根号a的近似值:首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代个六七次后x的值就已经相当精确了。 例如,我想求根号2等于多少。假如我猜测的结果为4,虽然错的离谱,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号2了:( 4 + 2/ 4 ) / 2 = 2.25( 2.25 + 2/ 2.2转载 2014-03-28 21:59:56 · 949 阅读 · 0 评论 -
高斯消元法与高斯约旦消元法
1、高斯消元法的算法(设akk(k)不等于0)将非零阵A=(aij)m×n,经过行初等变化,变为上三角矩阵。步骤:当m>n 当m当m=n 例1A= 此方法常用于解线性方程组和矩阵的秩的计算。如例1中矩阵A的秩r(A)=3。2、高斯约旦消元法的算法转载 2013-10-22 21:17:30 · 2773 阅读 · 0 评论 -
hdu 4462 Scaring the Birds
#include#include#include#include#includeusing namespace std;#define N 55int n,k;struct node{ int x,y,r;};node dao[15];vector q[15];int map[N][N],vis[N][N];int fabs(int x){ ret原创 2013-10-29 21:34:14 · 557 阅读 · 0 评论 -
uva 1386 - Cellular Automaton(循环矩阵乘)
解析:普通的矩阵乘法时间复杂度为:O(n^3logk),会超时 该矩阵式循环矩阵,每一层都等于上一层右移一位。循环矩阵相乘等于循环矩阵,所以时间复杂度缩小为O(n^2logk)其实还可以更简单的,开个一维数组,然后通过规律应用#include#include#includeusing namespace std;#define N 505typedef long原创 2013-10-22 18:35:34 · 770 阅读 · 0 评论 -
hdu 1395 2^x mod n = 1
#include#include#include#include#includeusing namespace std;typedef __int64 LL;#define N 100005LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b);}LL euler(LL x){ LL res=x,i; for(i=2原创 2013-10-29 09:12:59 · 625 阅读 · 0 评论 -
hdu 2462 The Luckiest number(快速乘取摸)
题意:求最小的n使得n个8组成的数mod k为 0思路:注意到凡是那种1111111..... 2222222..... 33333.....之类的序列都可用这个式子来表示:k*(10^n-1)/9进而简化:这个题会变成:8*(10^n-1)/9=k*m (k是一个整数)如果gcd(8,m)=t的话那么原始的式子可以改为:8/t*(10^n-1)=9m/原创 2013-10-29 09:18:30 · 622 阅读 · 0 评论 -
uva 10870 - Recurrences(矩阵乘法)
题意:给出f(n)的递推式,共的项,求f(n)mod m的值解析:f[n]=a1*f[n-1]+a2*f[n-2]+...+ad*f[n-d]; 由于n太大,不能直接递推,需要用矩阵快速幂来解决,时间复杂度为O(d^3logn) 举例,d=5的矩阵关系式为: |a1 a2 a3 a4 a5| | f[n] |原创 2013-10-22 14:56:39 · 530 阅读 · 0 评论 -
poj 3070 Fibonacci(矩阵快速幂)
题意:求Fibonacci数列,n很大#include#include#includeusing namespace std;#define mod 10000struct node{ int a[3][3];};node s;node multi(node x,node y){ node b; memset(b.a,0,sizeof(b.a))原创 2013-10-22 10:41:52 · 551 阅读 · 0 评论 -
poj 2891 Strange Way to Express Integers (剩余定理~不互质)
题意:给的ai ri ,求m 使得对所有的i都有 m%ai==r1解析:这道题不能直接用中国剩余定理,因为按照剩余定理的要求,a1,a2,a3....an要两两互素,而此题不符合。此题的方法是用扩展欧几里德,逐渐合并。例如有前两对数,a1,r1,a2,r2;设所求的数为m,则有:a1*x+r1=m=a2*y+r2联立得:a1*x-a2*y=r2-r1;设r=r2-r2 ;原创 2013-10-21 16:53:10 · 436 阅读 · 0 评论 -
hdu 4099 Revenge of Fibonacci(字典树+大数加法)
题意:给你一个数字字符串,表示一个整数的前几位(解析:赤裸裸的字典树,不过要用大数优化,坑爹的是插入时要严格控制小于100000,不能等于;就因为这个wa了好久#include#include#include#includeusing namespace std;#define N 100001int maxx=45;struct node{ int m原创 2013-10-30 18:26:22 · 552 阅读 · 0 评论 -
hdu 4059 The Boss on Mars(容斥原理)
题意:求1-n中与n互质的数的4次方之和,即S=a1^4+a2^4+……; a1,a2……均小于等于n且与n互质。先求出1^4+2^4+……n^4然后减去与n不互质的数的4次方。赤裸裸的容斥啊!!!!!!必然要先要用到4次方的求和公式。接下来简单的证明一下,这里前提是你知道3次方的公式,如果不会照下面的模式可以利用2次公式推出3次公式(x+1)^5=x^5+5*x^4+1原创 2013-11-02 17:34:30 · 565 阅读 · 0 评论 -
hdu 3037 Saving Beans( lucas定理+隔板法 )
题意:将不大于m颗种子存放在n颗不同的树中,可以为空,问有多少种存法。解析: 有隔板法可知 : m个种子,用 n-1个板子隔开,但由于可以为空,所以加n个种子,这样得到的答案是c(n+m-1,n-1);即为恰好放m个种子的放法数,可以考虑加一个板子,这样最后一个板子左侧的就是不大于m的部分,其右边是不需要的,所以 答案是C(n+m,n);这时就需要用lucas的模板了Lucas定理:原创 2013-11-18 21:17:48 · 731 阅读 · 0 评论 -
uva 10692 - Huge Mods(指数循环节)
题意:给出一个数m,和n个数a1~an 求a1^a2^a3...^an%m 的值解析: 用欧拉函数求解 ,有公式:证明:http://hi.baidu.com/aekdycoin/item/e493adc9a7c0870bad092fd9#include#include#include#includeusing namespace std;#define N 1原创 2013-10-04 18:58:33 · 736 阅读 · 0 评论 -
poj 1150 The Last Non-zero Digit
题意:求p(n,m) 的最后以为非0数,如 p(5,2)=5*4=20 所以答案是2解析:如何求出n!阶乘最后非0位?比如说我们要找10!最后非0位,由于质因数2和5组合之后会使得末尾产生0.那么我们不妨把10!中2,5质因数全部去掉,(但是请注意2的数目其实比5的要多,所以我们要在最后考虑多余的2对末位的影响)如 1*2*3*4*5*6*7*8*9*10 去掉2 ,5 因转载 2013-11-29 15:22:00 · 514 阅读 · 0 评论 -
HDU-1066 Last non-zero Digit in N!
题意: 求n的阶乘 n! 的最后一个非0数 如:5!=120 所以答案是2解析:先考虑简单的。考虑某一个N!(N =5,由于提出了一个5,因此需要一个2与之配成10,即将尾数除以2。注意到除了0!和1!,阶乘的最后一个非零数字必为偶数,所以有一个很特别的除法规律:2/2=6,4/2=2,6/2=8,8/2=4。比较特殊的就是2/2=12/2=6,6/2=16/2=8.这样我们就可以得到如下转载 2013-11-29 12:58:12 · 515 阅读 · 0 评论 -
poj 3358 Period of an Infinite Binary Expansion (费马小定理+分数化二进制小数)
题意:将一个小于1的小数表示成二进制形式。输出二进制形式下,小数部分第几开始循环,循环节长度是多少?解析:将一个分数化成小数,转化成二进制后寻找循环节对于分数P/Q而言,首先化成最简,调整为P'=P/GCD(P,Q) Q'=Q/GCD(P,Q)我们知道转化成二进制,其实就是不断乘2,如果大于1,则去掉1,当前位为1,否则为0.表示成分数的时候便是P/Q,2*P/Q如果分子大于分母,原创 2013-11-27 14:58:49 · 700 阅读 · 0 评论 -
卡特兰数 和 斯特林数
卡特兰数,第一类斯特林数,第二类斯特林数Catalan数 C(n),第一类Stirling数 s(p,k),第二类Stirling数 S(p,k)一.Catalan数 C(n) C(n) 的一个形象的例子是:2*n个括号,其中有n个前括号'('和n个后括号')',排成一列,满足所有括号都匹配的排列数。另一个例子是,n个1和n个-1,共2*n个数,排成一列,满足对所有0=0的排转载 2013-11-12 16:17:00 · 527 阅读 · 0 评论 -
hdu 3625 Examining the Rooms
题意:题目:就是给你N个房间,然后每个房间1把钥匙,你最初手里没有任何钥匙,要靠破门而入!这里只有第一个房间不能破门进去,其他都可以,给你房间数N,和最多能破门的个数,让你求能全部把房间打开的概率!解析: 赤裸裸的斯特林数啊!!#include #include using namespace std;const int A = 21;long long ans原创 2013-11-12 16:11:40 · 557 阅读 · 0 评论 -
poj 3682 King Arthur's Birthday Celebration(数学期望)
题意:抛硬币,正面朝上的概率为p,第i日抛硬币需要花费2i-1,每天都抛硬币,直到抛到k次硬币正面朝上才停止,问抛硬币的天数的期望和花费的期望。题解:设f[i]为第i天结束的概率,则f[i]=c(i-1,k-1)*p^k*(1-p)^(i-k),然而总概率为 ∑f[i]=1,其中i∈[k,+∞),以下均为此范围则有,p^k*sigma(c(i-1,k-1)*(1-p)^(i-k))=1转载 2013-11-23 15:35:28 · 794 阅读 · 0 评论 -
sgu 508 Black-white balls(贝叶斯公式的应用)
题意:n个球,取出p+q个球,其中黑球p个,白球q个,求一个黑球的取值区间,使得黑球数在该区间概率最低值为p解析:设n个球中有k个黑球的事件为Ak ,设取出p+q个球中有p个黑球为事件B题目所有概率为sum{p(Ak|B)}>=pri的k的取值区间 p(Ak|B)不好求解,通过贝叶斯公式p(Ak|B) = p(B|Ak)*p(Ak)/p(B)其中p(B|Ak) = C(p,原创 2013-11-20 17:04:23 · 1134 阅读 · 0 评论 -
uva 11542 - Square(高斯异或)
题意:给你n个数,从中选1个或多个,使得选出的整数的乘积是完全平方数,问有多少种选法?解析:xi=1表示选择第i个数,否则不选 4,6,10,15的因子只有2,3,5;可分解为4=2^2*3^0*5^0->(2,0,0)... 那么选出来的数的乘积就是2^(2*x1+x2+x3)*3^(x2+x4)*5^(x3+x4),要使其为完全平方数,则各原创 2013-10-24 21:27:32 · 636 阅读 · 0 评论 -
大数模板啊
#include #include #include #include #include #include using namespace std;const int MAXD = 500, DIG = 9, BASE = 1000000000;const unsigned long long BOUND = numeric_limits :: max () - (unsigne原创 2013-09-29 11:37:10 · 490 阅读 · 0 评论 -
hdu 3853 LOOPS(不错的入门经典)
题意:给出一个r*c的迷宫,每个格子可以走到(r,c),(r+1,c),(r,c+1),概率分别为p1 p2 p3 ,没走一次消耗2各单位的能量,问从(1,1)走到(r,c) 的平均能量解析:设dp[i][j]表示(i,j)到(R,C)需要消耗的能量则:dp[i][j]=p1[i][j]*dp[i][j]+p2[i][j]*dp[i][j+1]+p3[i][j]*dp[i+原创 2013-08-22 11:02:01 · 506 阅读 · 0 评论 -
hdu 4405 Aeroplane chess(入门经典)
题意:走飞行棋,从0开始,每次走骰子扔到的点数,当n>=N时停止,有些格子还有桥,如x到y的桥,则x可以直接到y(不扔骰子),m条桥,n+1格格子,问扔骰子的平均次数?dp[i]表示i点跳到目标状态的期望步数#include#include#include#include#includeusing namespace std;#define N 100010do原创 2013-08-22 09:00:18 · 536 阅读 · 0 评论 -
poj 2096 Collecting Bugs(概率dp入门)
逆着递推求解题意:(题意看题目确实比较难道,n和s都要找半天才能找到)一个软件有s个子系统,会产生n种bug某人一天发现一个bug,这个bug属于一个子系统,属于一个分类每个bug属于某个子系统的概率是1/s,属于某种分类的概率是1/n问发现n种bug,每个子系统都发现bug的天数的期望。求解:dp[i][j]表示已经找到i种bug,j个系统的bug,达到目标状态的原创 2013-08-21 17:15:11 · 546 阅读 · 0 评论 -
zoj 3640 Help Me Escape(概率DP)
题目意思: 一个吸血鬼,每天有n条路走,每次随机选一条路走,每条路有限制,如果当这个吸血鬼的能力大于某个值c[i],那么只需要花费ti(ti = (1.0 + sqrt(5.0))/2 * c[i] * c[i]) 天的时间就可以逃出去,否则,花费1天的时间,吸血鬼的能力增加c[i],花费1天的时间,然后继续下一天的尝试。求逃出去的期望。 设dp[v] ,表示当能力值为v的时的期望原创 2013-08-19 17:12:06 · 517 阅读 · 0 评论 -
zoj 3638 Fruit Ninja(多重集组合+乘法逆元+容斥原理)
题意: n种水果,取m个,每种水果可能有数量限制如苹果大于3个,桔子小于2个。问一共有几种取法?解答:多重集的x1+x2+。。。+xn=(m-k),k 为那些 至少多少个 的和,即c(n+r-1,r),其中r=m-k 求解c(n+r-1,r)时要用到逆元,求解那些至多多少个时,用容斥原理。。#include#include#include#includ原创 2013-08-20 09:23:44 · 1266 阅读 · 0 评论 -
hdu 4633 Who's Aunt Zhang(Burnside引理+乘法逆元)
根据Burnside引理,等价类数目等于所有 f 的不动点数目 C ( f ) 的平均值。本题模型共有4大类置换,共24种:1. 不做任何旋转 K ^ (54 + 12 + 8)2. 绕相对面中心的轴转1) 90度 K ^ (15 + 3 + 2) * 31) 180度 K ^ (28 + 6 + 4) * 31) 270度 K ^ (15 + 3原创 2013-08-03 10:00:20 · 770 阅读 · 0 评论 -
poj 1845 Sumdiv (快速求幂+同余或 乘法逆元)
大致题意:求A^B的所有约数(即因子)之和,并对其取模 9901再输出。 解题思路:要求有较强 数学思维 的题应用定理主要有三个:要求有较强 数学思维 的题应用定理主要有三个:(1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式。 A=(p1^k1)*(p2^k2)原创 2013-08-03 20:39:44 · 929 阅读 · 0 评论 -
hdu 4611 Balls Rearrangement
自己用欧几里得写了半天,结果还是错的,没想到可以直接暴力 太坑了#include #include __int64 gcd(__int64 a,__int64 b){ if(b==0)return a; else return gcd(b,a%b);}__int64 abs(__int64 a){ if(a>0)return a; return -a;原创 2013-07-27 09:59:13 · 537 阅读 · 0 评论 -
hdu 4704 Sum
题意:求整数划分的个数,即求 2^n % mod (n解析: 费马小定理,2^n=2^(x+k*(mod-1)) 而 2^(mod-1)%mod=1 (a*b)%mod=((a%mod)*(b%mod))%mod#include#include#include#include#includeusing namespace std;typedef __int64原创 2013-08-23 08:43:53 · 503 阅读 · 0 评论 -
poj 3071 Football(位运算的应用枚举)
题意:2^n个球队比赛,0和1比,2和3比,以此类推,循环比下去,直至只剩下一个队伍,问那个队伍的冠军的的概率最大 ?p【i】【j】为i打败j的概率解析:dp【i】【j】为第i场比赛j胜利的概率 ,则dp【n】【j】的最大值就是答案j 这题的关键是枚举,把球队比赛化成一棵二叉树,每次两个节点比#include#include#include#includeusin原创 2013-08-23 17:06:40 · 526 阅读 · 0 评论 -
zoj 3329 One Person Game(递推方程转化求解系数)
题意:有三个骰子,分别有k1,k2,k3个面。每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。当分数大于n时结束。求游戏的期望步数。初始分数为0设dp[i]表示达到i分时到达目标状态的期望,pk为投掷k分的概率,p0为回到0的概率则dp[i]=∑(pk*dp[i+k])+dp[0]*p0+1;都和dp[0]有关系,而且dp[0]就是我们所求,为原创 2013-08-23 20:39:20 · 592 阅读 · 0 评论 -
CF B. Stadium and Games
题意:x支队伍比赛,如果x为偶数,则比赛x/2场,一直递归循环下去,知道x为奇数, 若x为奇数,则比(x)*(x-1)/2 场,x=1则不用比了, 现给出总比赛场数n,求出所有x这道题思路很简单,设刚开始队伍数为d=2^p*x,其中x是奇数,则比赛场次n=(2^p-1)*x+(x-1)*x/2,然后从0开始枚举p的值,接着解一元二次方程x^2+(2^(p+1)-3)x-2*n=0,易知此方原创 2013-09-27 11:37:29 · 518 阅读 · 0 评论 -
uva 10673 - Play with Floor and Ceil(欧几里得)
题意:给出x和k ,求出一对p q 使得 解析:转化一下就变成了ax+by=c 的一组解 首先是要证明一个方程必定有整数解ax+by=gcd(a,b); 为方便 g=gcd(a,b), ax+by=g这个证明有些复杂就不写了,而如何构造一个可行解(x1,y1)其实也在证明过程中在得到一个可行解后就可以得到无数组解,他们是(x1-k*(b/g) ,原创 2013-10-03 22:19:47 · 676 阅读 · 0 评论 -
uva 10883 - Supermean( 找规律, log( c(n,m)) )
题意:给出n个数,每相邻两个数求平均数,将得到n-1个数,这样循环下去,直到得到最后一个数,求这个数?解析:设这个数为x, 经过分析可得2^(n-1)*x=a[i]*c(n-1,i)的和(0设 f[x]=log(x!);则 log( c (n,m)/(2^(n-1) ) )=f[n]-f[m]-f[n-m]-n*(log(2.0));再用exp()返回结果就可以了原创 2013-10-03 13:30:10 · 912 阅读 · 0 评论 -
uva 11038 - How Many O's?
题意:求[m,n]中有多少个0题解:分位数分析:n的第i位不为0=n左边的数(高位)*10^(i-1)n的第i位为0 =(n左边的数-1)*10^(i-1)+(i位右边的数+1)ans=f(n)-f(m-1);注意m为0的情况即可。#include#include#include#includeusing namespace std;typed原创 2013-10-03 10:52:51 · 602 阅读 · 0 评论 -
uva 10791 - Minimum Sum LCM
题意(就是因为读错题意而wa了一次):给一个数字n,范围在[1,2^23-1],这个n是一系列数字的最小公倍数,这一系列数字的个数至少为2例如12,是1和12的最小公倍数,是3和4的最小公倍数,是1,2,3,4,6,12的最小公倍数,是12和12的最小公倍数………………那么找出一个序列,使他们的和最小,上面的例子中,他们的和分别为13,7,28,24……显然最小和为7这个题原创 2013-10-02 20:31:49 · 571 阅读 · 0 评论 -
uva 12050 - Palindrome Numbers
#include#include#include#includeusing namespace std;typedef long long LL;const LL maxx=2000000000;#define N 100LL sum[N],dp[N];void inint(){ int i,j; dp[0]=0; sum[1]=dp[1]=9原创 2013-09-30 22:31:59 · 673 阅读 · 0 评论 -
数论的典型例题
1、本原勾股数:概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b^2=c^2首先,这种本原勾股数的个数是无限的,而且构造的条件满足:a=s*t,b=(s^2-t^2)/2,c=(s^2+t^2)/2其中s>t>=1是任意没有公因数的奇数!由以上概念就可以导出任意一个本原勾股数组。2、素数计数(素数定理)令π(x)为1到x中素数的个数1原创 2013-09-14 09:41:27 · 981 阅读 · 0 评论