1.burnside 定理,polya 计数法
这个大家可以看brudildi 的《组合数学》,那本书的这一章写的很详细也很容易理解。最好能完全看懂了,理解了再去做题,不要只记个公式。
* 简单题:(直接用套公式就可以了)
# pku2409 Let it Bead // 翻转时注意珠子为奇偶的情况。
http://acm.pku.edu.cn/JudgeOnline/problem?id=2409
# pku2154 Color//LTC 的题目,看《具体数学》p141 ,有个化简的公式。
http://acm.pku.edu.cn/JudgeOnline/problem?id=2154
# pku1286 Necklace of Beads // 和2409 一样
http://acm.pku.edu.cn/JudgeOnline/problem?id=1286
* 强烈推荐:(这题很不错哦,很巧妙)
# pku2888 Magic Bracelet // 见月赛解题报告.A[i][j] 为可达矩阵. 而且注意约数的个数范围。其中矩阵的幂可以预先求出所有matrix[2^i] 出来,然后根据二进制来 求。
http://162.105.81.212/JudgeOnline/problem?id=2888
2. 置换,置换的运算
置换的概念还是比较好理解的,《组合数学》里面有讲。对于置换的幂运算大家可以参考一下潘震皓的那篇《置换群快速幂运算研究与探讨》,写的很好。
* 简单题:(应该理解概念就可以了)
# pku3270 Cow Sorting // 列出置换,然后对于每一个置换循环,不断用环中的最小的那个和其他的进行换位,可以得到最优。另外还有一种情况就是用整个置换最小的那个和该环进行 换位,对于每个环求出这两个的最小值加起来就可以了。
http://acm.pku.edu.cn/JudgeOnline/problem?id=3270
# pku1026 Cipher // 先找出所有置换循环,然后对于每一位来计算k% 循环长度后对应于哪个位置,O(n) 复杂度。注意读写方面的东西。
http://acm.pku.edu.cn/JudgeOnline/problem?id=1026
* 置换幂运算:
# pku1721 CARDS // 详细见05 集训队论文《置换群快速幂运算研究与探讨》。
http://162.105.81.212/JudgeOnline/problem?id=1721
# pku3128 Leonardo's Notebook// 摘自:http://blog.csdn.net/J_Factory/archive/2008/08/28 /2845330.aspx
题目意思是:一个置换是否可以由另一个置换的平方得来的。一个置换的平方,原来偶数长的循环会被分裂成两段长度相等的循环,而奇数长的循环不会被分裂。题 目只是问是否存在,所以只要看所给置换中偶数长的循环是否成对,否则就不能由一个置换的平方得来。
补充:因为如果所给置换的循环是偶数,则肯定是由分裂过来的,那么一定是成对的,否则如果是奇数,那么有可能是原来是奇数,也有可能是原来的偶数分裂成两 个奇数循环。
http://162.105.81.212/JudgeOnline/problem?id=3128
* 推荐:(不错的应用)
# pku3590 The shuffle Problem // 把n 分解成若干个数,使得他们的lcm 最大。在所取的数都是素数幂的时候是最大的,所以可以用递归来枚举所有的分解情况,而且由于要输出序最小的, 所以对于剩下的数可以直接单独都作为一个循环,这样就可以使得序最小了。此外,这道题目需要注意求最大的lcm 的时候不能用dp 来做,因为这个具有后效 性,局部最优不一定使得全局最优。
http://162.105.81.212/JudgeOnline/problem?id=3590
3. 素数,整数分解,欧拉函数
素数是可能数论里最永恒,最经典的问题了(我们的队名就叫PrimeMusic^-^ )。素数的判断,筛法求素数,大素数的判断··· 还有很多其他问题 都会用到素数。
* 最水最水的:(心情不爽时用来解闷吧)
# pku1365 Prime Land
# pku2034 Anti-prime Sequences// 直接搜索,用DL 优化会快很多。
# pku2739 Sum of Consecutive Prime Numbers
pku3518 Prime Gap
pku3126 Prime Path
pku1595 Prime Cuts
pku3641 Pseudoprime numbers
pku2191 Mersenne Composite Numbers
pku1730 Perfect Pth Powers
pku2262 Goldbach's Conjecture
pku2909 Goldbach's Conjecture
* 筛法:
# pku2689 Prime Distance (很好的一个应用)// 先找出sqrt(2^32) 内的所有素数,然后类似筛选法筛选掉[l,u]范围内的数
http://162.105.81.212/JudgeOnline/problem?id=2689
* 反素数:
# zoj2562 More Divisors //waing... 后记:素数表少打了一个19 ~晕死啊~。。
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2562
* 素数判断,整数分解:
这两题都要用到miller_rabin 的素数判断和pollard_rho 的整数分解,算法书上都会有,应该是属于模板题吧,不过最好看懂自己敲一 遍。
# pku1811 Prime Test // 学习miller 和pollard 的题目。
http://acm.pku.edu.cn/JudgeOnline/problem?id=1811
# pku2429 GCD & LCM Inverse // 分解lcm/gcd 为互质的p,q ,要用到Miller Rabin 和Pollard rho 算法,基本上做出来之后都是模板题了。
http://acm.pku.edu.cn/JudgeOnline/problem?id=2429
* 欧拉函数:
数论里很多地方都能用到欧拉函数,很重要的。
# pku1284 Primitive Roots (很水)// 定理:对于奇素数m, 原根个数为phi(phi(m)), 由于phi(m)=m-1, 所以为phi(m-1)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1284
# pku2407 Relatives (很水)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2407
# pku2773 Happy 2006 //n 之后的互质的数都是n 之前的加上n 的倍数的。
http://162.105.81.212/JudgeOnline/problem?id=2773
# pku2478 Farey Sequence (快速求欧拉函数)// 求前n 个欧拉函数的和,用学习指导里面的n*(1+lnln(n)) 的算法就可以了,非常快。
http://162.105.81.212/JudgeOnline/problem?id=2478
# pku3090 Visible Lattice Points (法雷级数)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3090
* 推荐:(欧拉函数,费马小定理)
# pku3358 Period of an Infinite Binary Expansion// 转化为高次同余方程。
http://acm.pku.edu.cn/JudgeOnline/problem?id=3358
* 整数分解
这个也很重要的耶,包括大数的表示方法。
# pku2992 Divisors// 注意预处理,有很多组数据.
http://acm.pku.edu.cn/JudgeOnline/problem?id=2992
? fzu1753 Another Easy Problem// 记得n! 有多少个p 的幂是怎么求的。
http://acm.fzu.edu.cn/problem.php?pid=1753
hit2813 Garden visiting
http://acm-hit.sunner.cn/judge/show.php?Proid=2813
? pku3101 Astronomy (分数的最小公倍数)// 高精度gcd ,超时中。
http://acm.pku.edu.cn/JudgeOnline/problem?id=3101
4. 扩展欧几里得,线性同余,中国剩余定理
这应该是数论里比较重要的一个部分吧,这类的题目也挺多,具体的内容最好先看看数论书,我也整理过一些,可以参考参考:
http://hi.baidu.com/����_shw/blog/item/0676025d56a87d4afbf2c093.html
* 简单题:
# pku1006 Biorhythms // 注意最后结果为0 或负数的情况
http://acm.pku.edu.cn/JudgeOnline/problem?id=1006
# pku1061 青蛙的约会
http://acm.pku.edu.cn/JudgeOnline/problem?id=1061
# pku2891 Strange Way to Express Integers //x==a1(mod m1),x==a2(mod m2), 两个方程可以求出x ,然后重新令a1 为求出的解x,m1=lcm(m1,m2) ,然后继续和后面的进行求解。注意数据运算过程中可能溢出的问题。
http://acm.pku.edu.cn/JudgeOnline/problem?id=2891
# pku2115 C Looooops
http://acm.pku.edu.cn/JudgeOnline/problem?id=2115
# pku2142 The Balance // 枚举,x=x0+b/d*t ,直到x>min(x+y)
http://162.105.81.212/JudgeOnline/problem?id=2142
* 强烈推荐:
# sgu106 The equation // 求ax+by=c 的时候,考虑a,b 为零的特殊情况,此外,若a,b 不是非负数,那么扩展欧几里德会有问题,于是我们可以把求x,y 变为求 x'=-x,y'=-y ,此时a,b, 就可以变为非负数来处理,同时x',y' 的范围也要相应取反。而且在取得区间时候,要注意区间边缘要进行相应的取 整。后记:要用cin,cout 才能AC ,用printf 会wa 。。。极度无奈中,偶然才发现的~_ ~!
http://acm.sgu.ru/problem.php?contest=0&problem=106
# pku3708 Recurrent Function (经典)// 具体数学第一章。对于每一位求出循环节m1 ,还有该位从m 达到k最少要经过r1 次标号变化,于是就可以得到x==r1 (mod m1) ,然后同样的方法求其他的位,接着就可以两两方程这样解中国剩余定理。
http://acm.pku.edu.cn/JudgeOnline/problem?id=3708
5. 约瑟夫环问题
这个问题还是比较有意思的,不是很难。
* 简单题:
# pku3517 And Then There Was One
http://acm.pku.edu.cn/JudgeOnline/problem?id=3517
# pku1781 In Danger
http://acm.pku.edu.cn/JudgeOnline/problem?id=1781
# pku1012 Joseph // 考虑剩下k+1 个人,那么上一个出局的人肯定是坏人,所以考虑接下来一定要最后一个坏人出局,所以m==0 或1(mod k+1) 。然后枚举m ,再验证。
http://162.105.81.212/JudgeOnline/problem?id=1012
# pku2244 Eeny Meeny Moo
http://162.105.81.212/JudgeOnline/problem?id=2244
* 推荐:
# pku2886 Who Gets the Most Candies?// 线段树+ 反素数。
http://162.105.81.212/JudgeOnline/problem?id=2886
6. 高斯消元法解方程
其实解方程并不是很难,就是按线性代数中学的那种方法,把系数矩阵化成上三角矩阵或数量矩阵,不过有些题目要判断是否有解,或枚举所有解。不过这类题目 我认为比较难的还是怎么去建立这个方程组,这个理解了,就没什么大问题了。
* 简单题:
# pku1222 EXTENDED LIGHTS OUT // 解异或运算的方程。n*m 个方程和未知数。
http://162.105.81.212/JudgeOnline/problem?id=1222
# pku1681 Painter's Problem
http://162.105.81.212/JudgeOnline/problem?id=1681
# pku1830 开关问题 // 以上三题做法都一样。
http://162.105.81.212/JudgeOnline/problem?id=1830
* 推荐:
# pku2947 Widget Factory // 最好要化成严格的阶梯型,方便判解。而且模某个数的时候解方程要用到扩展欧几里德算法。
http://162.105.81.212/JudgeOnline/problem?id=2947
# pku2065 SETI// 与上题一样。
http://162.105.81.212/JudgeOnline/problem?id=2065
* 强烈推荐:
# pku1753 Flip Game // 数据范围比较小,枚举可过。如果用高斯消元做,那么对于多解的时候也是需要枚举的,而且这种类型不具有太大的扩展性,这里高斯消元不见的比枚举要优 越。
http://162.105.81.212/JudgeOnline/problem?id=1753
# pku3185 The Water Bowls // 同样如果对于无数解的时候,就需要对解进行枚举。其实这道题目可以先枚举第一位是否需要翻转,然后其他的就已经确定了,不过需要注意如果第一位翻转的 时候,答案别忘了加上去,我因为这个搞了好久~~~郁闷。
http://162.105.81.212/JudgeOnline/problem?id=3185
// 同类题目,我自己加上去的。
pku1395
pku2055
ural1561
pku3254
* 变态题:
pku1487 Single-Player Games
http://162.105.81.212/JudgeOnline/problem?id=1487
7. 矩阵
用矩阵来解决问题确实很常见,但我现在用到还不是很好,很多难题我还不会做。建议大家可以去看Matrix67的那篇关于矩阵的十个问题,确实很经典, 但不太好看懂。
* 简单:
pku3070 Fibonacci
http://162.105.81.212/JudgeOnline/problem?id=3070
pku3233 Matrix Power Series
http://162.105.81.212/JudgeOnline/problem?id=3233
pku3735 Training little cats
http://162.105.81.212/JudgeOnline/problem?id=3735
8. 高次同余方程
有关这个问题我应该是没什么发言权了,A^B%C=D ,我现在只会求D 和B ,唉,很想知道A 该怎么求。就先推荐几道题目吧,这里涉及到了一个baby- step ,giant-step 算法。
# fzu1759 Super A^B mod C //a^b%c=a^(b%phi(c))%c , 注意a==c 的情况,
http://acm.fzu.edu.cn/problem.php?pid=1759
# pku3243 Clever Y // 和上面差不多,不过c 不一定是素数,所以方法就是解出a^m*x+c*y=gcd(a^m,c) 的所有解来判断,若无解则不管,因为c 不是素数可能 a^m 没有逆。
http://162.105.81.212/JudgeOnline/problem?id=3243
# pku2417 Discrete Logging //hash ,最直接的离散对数
http://162.105.81.212/JudgeOnline/problem?id=2417
? hdu2815 Mod Tree // 超时中,时限好像挺紧的。
http://acm.hdu.edu.cn/showproblem.php?pid=2815
# sgu261 求A wa test 23.. 后记:原来是hash 有错误,因为用了vector 后是从0 开始的,而我判断hash 链表结束的是0 ,如果恰好最后一个是在vector 的0 位 置,那么就会忽略掉这个数据,所以就会出现找不到那个数的情况。另外进行最后答案输出的时候,vector 的size ()是返回unsigned int 的,如果size( )是0 ,那么size()-1就是2^32-1 了,所以这里就需要特别注意。
? http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3538 //handling... 还没有找出更好的方法解决当a 和p 不互质情况下的解法。
http://202.120.80.191/problem.php?problemid=2700
9. 容斥原理,鸽巢原理
很有用的两个定理,但好像单独考这两个定理的不是很多。
* 鸽巢原理:
# pku2356 Find a multiple // 同下。
http://162.105.81.212/JudgeOnline/problem?id=2356
# pku3370 Halloween treats////n 个数,寻找c 个(c<=n) ,使得他们的和为c 的倍数。由抽屉原理,前n 个数的mod c 肯定有重复的,那么一定存在一个区间使得他们的和是c 的倍数。
http://162.105.81.212/JudgeOnline/problem?id=3370
* 容斥原理:
# hdu1695 GCD // 求gcd(x,y)=k 的个数,相当于求gcd(x/k,y/k)=1 的个数,其中x/k 在[a/k,b/k],y/k 在[c/k,d/k] 之间。所 以就是求在一定区间内,x ,y 互质的对数。假设b (此处b,d 已除k )那么对于<=b, 直接用欧拉函数就可以了,对于[b+1,d] 之 间的数,对于每一个分解质因数,然后利用容斥原理,求出[1,b ]之间和这个数互质的个数。注意最后答案可能超过int ,用I64d 输出。
http://acm.hdu.edu.cn/showproblem.php?pid=1695
# hdu2461 Rectangles // 对称情况下才能使用懒标记,而且覆盖的标号不向下传。另外在pku3695 上同样的题目由于时限很紧,所以可以对坐标进行离散化。log1000 和 log40 还是有差别的。
http://acm.hdu.edu.cn/showproblem.php?pid=2461
10. 找规律,推公式
这类题目的设计一般都非常巧妙,真的是很难想出来,但只要找到规律或推出公式,就不是很难了。我很多都是在参考别人思路的情况下做的,能自己想出来真的 很不容易。
* 个人感觉都挺不错的:
# pku3372 Candy Distribution// 找规律。。。其实可以进行分析的。
http://162.105.81.212/JudgeOnline/problem?id=3372
# pku3244 Difference between Triplets// 这道题目要用到一个很巧妙的转化,把比较转化为绝对值的计算。因为max(a,b,c)-min(a,b,c)=(|a- b|+|a-c|+|b-c|)/2, 然后剩下的就容易做了。
http://162.105.81.212/JudgeOnline/problem?id=3244
pku1809 Regetni
http://162.105.81.212/JudgeOnline/problem?id=1809
pku1831 不定方程组
http://162.105.81.212/JudgeOnline/problem?id=1831
# pku1737 Connected Graph //f[n] 为n 个点的联通数,那么f[n]=2^(c[n][2])-sigma(f[k]*c[i-1][k-1]*2^(c[n-k][2]))
http://162.105.81.212/JudgeOnline/problem?id=1737
# pku2480 Longge's problem//sigma(gcd(i,n))=sigma(d|n && d*[gcd(i,n)==d]), 枚举所有n 的约数d ,然后对于n/d ,找出所有和n/d 互质的数的个数就是gcd(i,n)==d 的个数,从而用欧拉 函数解决。
http://162.105.81.212/JudgeOnline/problem?id=2480
pku1792 Hexagonal Routes
http://acm.pku.edu.cn/JudgeOnline/problem?id=1792
11. 排列组合,区间计数,计数序列
这些题目可能需要一些组合数学知识,基本上高中的知识就够了。区间计数问题一般不难,但写的时候需要仔细一些,各种情况要考虑到位。至于像卡特兰数,差 分序列,斯特灵数··· 都还挺有意思,可以去看看《组合数学》。
* 简单题:
pku1850 Code
http://162.105.81.212/JudgeOnline/problem?id=1850
pku1150 The Last Non-zero Digit
http://162.105.81.212/JudgeOnline/problem?id=1150
pku1715 Hexadecimal Numbers
http://162.105.81.212/JudgeOnline/problem?id=1715
pku2282 The Counting Problem
http://162.105.81.212/JudgeOnline/problem?id=2282
pku3286 How many 0's?
http://162.105.81.212/JudgeOnline/problem?id=3286
* 推荐:
pku3252 Round Numbers
http://162.105.81.212/JudgeOnline/problem?id=3252
* 计数序列:
pku1430 Binary Stirling Numbers
http://162.105.81.212/JudgeOnline/problem?id=1430
pku2515 Birthday Cake
http://acm.pku.edu.cn/JudgeOnline/problem?id=2515
pku1707 Sum of powers
http://acm.pku.edu.cn/JudgeOnline/problem?id=1707
12. 二分法
二分的思想还是很重要的,这里就简单推荐几个纯粹的二分题。
* 简单:
pku3273 Monthly Expense
http://162.105.81.212/JudgeOnline/problem?id=3273
pku3258 River Hopscotch
http://162.105.81.212/JudgeOnline/problem?id=3258
pku1905 Expanding Rods
http://162.105.81.212/JudgeOnline/problem?id=1905
pku3122 Pie
http://162.105.81.212/JudgeOnline/problem?id=3122
* 推荐:
# pku1845 Sumdiv // 令a=p1^m1 * p2^m2 * ... * pk^mk, 那么由于因数和是一个积性函数,
所以 f(a)=f(p1^m1)*f(p2^m2)*.. ; f(x^t)=1+x+x^2+..+x^t=(1-x^(t+1))/(1-x);
由于mod 某个数,所以可以1/(1-x) 可以用同余数解决。不过注意如果MOD | x-1, 那么 f(x^t)=t+1 特殊处理一下。
http://acm.pku.edu.cn/JudgeOnline/problem?id=1845
13. 稳定婚姻问题
无意中接触到这个算法,还蛮有意思的,《组合数学》中有详细的介绍。
pku3487 The Stable Marriage Problem
http://acm.pku.edu.cn/JudgeOnline/problem?id=3487
zoj1576 Marriage is Stable
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1576
14. 数位类统计问题
在航点月赛中第一次接触到这类问题,scau 大牛little 龙推荐我看了一篇论文,09 年刘聪的《浅谈数位类统计问题》,这篇论文相当精彩,也相当详 细,每道题都有详细的分析和作者的参考代码。所以我也没什么可说的了,这些题的代码我博客里也就不贴了,大家直接去看论文吧。
简单:
ural1057 Amount of degrees
http://acm.timus.ru/problem.aspx?space=1&num=1057
spoj1182 Sorted bit squence
https://www.spoj.pl/problems/SORTBIT/
hdu3271 SNIBB
http://acm.hdu.edu.cn/showproblem.php?pid=3271
较难:
spoj2319 Sequence
https://www.spoj.pl/problems/BIGSEQ/
sgu390 Tickets
http://acm.sgu.ru/problem.php?contest=0&problem=390
以上分类的题目在我的博客里都可以找到详细的解题报告和参考代码,由于比较麻烦就没加链接,需要的可以用我的站内搜索找到。
本小结会不断更新,转载请注明出处。
欧拉函数。
# pku 3696 The Luckiest number
//(10^n-1+..+10+1)=(10^n-1)/9, 欧拉函数,离散对数,注意溢出处理(相乘时变为aT+b )。
http://acm.pku.edu.cn/JudgeOnline/problem?id=3696
树状数组
# hdu 3333
先求出每个位置后面和它一样的最近的那个数的位置next[i] ,然后用树状数组记录不重复的前n 个数的和,接着对询 问区间排序,从左到右做,记left 为在当前区间左边的那些数,通过树状数组,将left 到next[left]-1 之间的所有的数都减去 val[left] ,然后就可以直接像sum[i]-sum[j] 那样方便的求出区间里面没有重复的数的和。
http://acm.hdu.edu.cn/showproblem.php?pid=3333
# pku 3222 // 树的dfs 和分治思想
解题报告见此:http://acm.pku.edu.cn/JudgeOnline /showmessage?message_id=129459