扩展欧几里得的较好讲解
http://hi.baidu.com/blackstar08/blog/item/5a1b9a2687d07f08918f9d73.html
poj 1061 和 2115
poj 3292
素数筛法的一个创新型运用。从小往大扫,如果一个数可以表示成 两个非H-prime数的乘积,那么他们一定不是 所求的H -semi-prime,但是如果能表示成两个H-prime数的乘积他们也不一定是H -semi-prime,因为还要看他们有没有其他的表示。
poj 1845
第一步当然是把这个数拆成质因子的乘积,然后再进行变换
如果用二分法,分出奇数偶数,然后再用递归这样写十分快捷。
如果想到了用等比数列,然后再用逆元来求,也可以,但是我写的时候暴了。
网上有人给了个公式,但是不知道证明的是怎么,在poj discuss 里面有。
这道题主要 用生成函数后,然后用要想到递归的思想来水过,如果用等比数列可能会超long long ,而且等比数列可能处理也会很麻烦。递归的时候还要算一下二分十分超时
poj 2115 欧几里得,用扩展欧几里得,然后求线性方程都可以解这道题。不过具体证明,感觉不是很熟练。(扩展欧几里得运用。主要掌握其最大正数,和最小正数。)
poj 3252
难度主要在于怎么去想递推公式
这是这类构造一个数(满足某些性质,比如二进制数0比1多,或者这个数里面有多少13等等这类问题)
一般的思想是用动态规划,但是如果状态想的不好,可能会写的很麻烦,最后细节想不清楚
有些时候又是组合数。比如这道题。
其实这道题目的关键是怎么去构造组合数。
对于一个像101110 这样的 数
首先 考虑小于100000 的数。状态f[i][j]是首位为1的数有i个0 j个1
这样可以确定首位后随意构造(这就是这种方法的好处)
然后是大于100000 的数,首先 从高位网低位考虑 101110 当我们碰到从左往右的1时(不包括首位)那么这一位可以为0 ,然后考虑他为0 的时候,可以怎么构造满足题意的数。
这样就可以推出大于100000 的数
这里还有一个要住注意的是 111000 与111001 的区别,要考虑一下本身,上面讨论很可能漏掉本身。
poj 1286
置换群用polyer 定理,但是求循环节是这道题的难点。考虑旋转和翻转两种情况。首先旋转
对于一个 有n个点的圆那么他们的旋转有 n个( 对于一个i长度的循环,i分别取i 0-n-1)它的循环节是gcd(n,i),因为一个数要总长度 lcm(n,i) 那么长的置换才能回到原来的那个数,每一个要 lcm(n,i)/i 个数, 然后 循环节数为 n/(lcm(n,i)/i)= n*i/(lcm(n,i))=gcd(n,i);
比如 n = 6 , i = 2
1 2 3 4 5 6
1 3 5
2 4 6
lcm (6,2) = 6
一个循环 要 lcm(6,2)/2= 3 个数
循环节 为 gcd(6,2) = 2;