随笔分类 -  算法--数论/组合数学/计算几何

摘要:题意: 有N(n<=1000)个数 a1,a2,..,an, ai <= 10^15, 取其中部分组合相乘的到数是一个完全平方数.求方案总数.其中保证 ai 不包含大于500的质因子.解题思路: 解决本题需要有,线性代数基础. 涉及到关于矩阵的初等变换与高斯消元.求解齐次方程. 首先考虑,一个数 x = p1^e1 * p2^e2 * ... * pn^en 若其是一个完全平方数,则 所有的 ei % 2 == 0 . 另外. 取部分数相乘. 例如三个数 ai*aj*ak = x ,此时我们只关心的是其对应的质因子的幂皆为偶数. 所以对于 ai = p1^e1 * p2^e2 * 阅读全文
posted @ 2013-04-28 17:08 yefeng1627 阅读(192) 评论(0) 推荐(0)
摘要:题意: 统计长度为n的绳子,截成多个相似三角形,方案数思路: 先整体看此题, 设定一个函数 g(x), 表示周长为x的本质三角形(a,b,c),其 gcd( a,b,c ) = 1, 的数量 则我们可以知道, 对于长度为 n 的铁丝, 能拆成 n/d 个长度为 d的 本质三角形, d个点,d-1个空隙, 因为可以组合,这样得到的三角形两两相似, 方案数就是 g(d) * r^(n/d-1) . 大意就是利用最小单位的三角形来拼.d-1个空隙都有两个选择,取于不取,取则分开,不取则组成成一个大三角形,则最终结果为 \sum g(d) * r^( n/d-1 ) 其中 n%d = 0... 阅读全文
posted @ 2013-04-25 20:27 yefeng1627 阅读(494) 评论(0) 推荐(0)
摘要:题意: 定义 f(x) = { num | a*b| x } , 求 \sum { f(x) } , x <= 10^11思路: 题目等价于求 a*b*c <= n 的数量. 假定 a <= b <= c. 则 a <= n^(1/3) , b <= n^(1/2) 所以我们可以通过枚举 a,b 计算出数量,时间复杂度未 O(n^(2/3)) 对于枚举的 a, b, c; 有三种情况 1 . 三个相等 a, a, a 则只需要计算一次 , 数量为: n^(1/3) 2. 二个相等, a, a, b or a, b, b 则需要计算 C(1,3) = 3 次 阅读全文
posted @ 2013-04-24 15:15 yefeng1627 阅读(301) 评论(0) 推荐(0)
摘要:首先是对于概率的计算,负二项分布: 物品A取与不取概率为,p,1-p, 共取 k+r次,最后一次取A ,且取A总次数为 r 次概率为: 则这里两个盒子取也可转换成此模型, 则期望公式为: 然后是公式的计算, 这里有两个问题. 1. 组合数 \binom{ 2n }{ n } 太大,会上溢 2. p^n 太小会下溢.对于问题一: 排列过大,考虑到 y = logx 函数, log(n!) 也不会很大. 又 令 f(x) = log( x! ),则有 预处理出 函数f() 就可以 O(1)求出 log( \binom{n}{m} )了. 然后 再求个 exp( x ... 阅读全文
posted @ 2013-04-24 13:48 yefeng1627 阅读(1300) 评论(0) 推荐(0)
摘要:题意: 有N个顶点,每个顶点由M*M矩阵构成, 对于顶点 A, B,C, 若 A*B = C,则存在一条路 (a,c)路径为1, K次询问,问 (x,y)最短路径。 N,M 《= 100解法: 用矩阵乘法 暴力找出 顶点间关系, 然后Floyd跑一次。 好久没写矩阵乘法了。顺便当模板敲一次。View Code #include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;cons 阅读全文
posted @ 2013-04-22 22:47 yefeng1627 阅读(148) 评论(0) 推荐(0)
摘要:对于序列 a_1,a_2,..a_i.,a_n从小到大排列处理花费会最小。一个一个处理完,例如当处理 a_1 则此时花费分为 a_1, 以及 a_x (x>1)的花费来计算 1. a_1 时 2. a_x 时 当消除掉 a_1 后,又生成一个新的 序列 a_1`, a_2`, ..., a_n` 此时可以知道, a_i` = a_i - a_1 + 1 我们可以通过 线段树来 维护更新序列,这样省事. 但是这题 n = 1e5 , 且极限T = 100, 此时时间复杂度达到 1e7,若再添加个 log(N) 复杂度,就会TLE了。 我们可以发现总花费为 序列除了被... 阅读全文
posted @ 2013-04-14 21:56 yefeng1627 阅读(267) 评论(3) 推荐(0)
摘要:A Jason的特殊爱好 组合数学, 通过计算 [1,n]区间数量解决. 假设n十进制表示位数为L,则通过统计长度为 L, L-1, ..., 1的数量来得出结果. 假设 n = a1,a2,a3,...,aL // 十进制表示,其中a1为高位 一.当长度小于L, 假设其为 len = 1,2,...,L-1 则当前数 X = a1,a2,a3,...,a_len 因为 Length(X) < Length(N), 所以任意的X都小于N, 我们可以枚举 X中包含的1的个数,假设其为 K, 则 K = 0,1,2,...,len... 阅读全文
posted @ 2013-04-06 18:32 yefeng1627 阅读(294) 评论(0) 推荐(0)
摘要:题意 已知一个数X有K个因子,求最小的X。解法 搜索剪枝 对于任意整数 其因子个数为: 意味着 因为需要最小的整数 N, 则我们使用小的质因子总是最优. 所以我们枚举 #include<stdio.h>typedef long long LL;const LL INF = 1000000000000000010ll; int p[12] = { 2,3,5,7,11,13,17,19,23,27,29,31}; int N; void dfs( LL &ans, int i, LL x, int n ){ if( n > N ) return; // 基本减枝 if. 阅读全文
posted @ 2013-04-01 12:21 yefeng1627 阅读(276) 评论(0) 推荐(0)
摘要:题意 输入N (N <= 1e4), 求满足 的整数解 (x,y)的数量。解法 令 N! = M, 且分析等式可以知道, X > M, Y > M 假设 X = M + K , 其中K为正整数 则原式转换成: 又 Y 为正整数, M也为正整数, 则若需要满足条件则 M^2 % K == 0 则题目就转换成为 求 M^2 = ( N! )^2 的因子个数 又 对于任意正整数 其因子数量为 因为题目所给的 M = N! 对于 N! 的质因子分解,我们可以不需要从1到N进行枚举。仅仅通过N即可得出 [1,N] 的素因子及素因子次数。 阅读全文
posted @ 2013-03-29 16:41 yefeng1627 阅读(145) 评论(0) 推荐(0)
摘要:浅谈贪心思想在动态规划中的应用 -----黄劲松 论文中的例题,其中也附有详接 讲讲自己的理解吧. 题目所求为, 使用某种特定策略,使从根节点rt ,依次到每个叶子节点最少步长. 再除以叶子节点数量. 即为最终期望值. 对于一个以 rt 为根的子树上, 我们将其分为 House在子树rt上的步长总数Fa , 以及不在子树上步长总数Fb: 表示 House 在 该rt为根子树上的 步长总数 表示House 不在 该rt为根子树上的 步长总数 表示 该子树上 叶子节点数量 则所求期望为: 若节点 u, 有 k 个子节点, 按照 s1... 阅读全文
posted @ 2013-01-16 22:16 yefeng1627 阅读(519) 评论(0) 推荐(0)
摘要:一, 将C个顶点排序后枚举两点构成直线,然后求最值. ( 排序后枚举,可减少重复枚举 ) 二, 我们枚举两点 (i, j ) ,因为我们排序后 (Xi,Yi)都比(Xj,Yj)都小,我们假定 Point(i) 作为跳进稻田路径的第一个点,这样,我们在之后枚举到相同路径的顶点时,就无需重复计算。 三,跳跃距离(dx,dy)向量相同,我们用 bool vis[5000][5000] 来标记合法点,当未跳出稻田且该点不合法则结束。解题代码:View Code #include<stdio.h>#include<string.h>#include<stdlib.h> 阅读全文
posted @ 2013-01-12 22:25 yefeng1627 阅读(240) 评论(0) 推荐(0)
摘要:将方差公式转换 : 方差: 均值: 得到: 我们知道 均值 X 为定值,与如何划分无关, 所以上述公式, 仅与 有关. 那么我们可以通过求出最优的, 即可求出最优 方差值. 因为对于任意矩形,我们可以通过 其左上角,右下角 坐标来唯一确定,且要保证结果无后效性,我们增加一维切割次数N 定义状态 DP(N,X1,Y1,X2,Y2) 为将 矩形(X1,Y1,X2,Y2)划分N次 的最小 平方值和 则根据题目得到 对于当前状态 DP(K,X1,Y1,X2,Y2) 对于 矩形 (X1,Y1,X2,Y2) ,依据题目要求只可在边缘切割,所以我们的切割方案分... 阅读全文
posted @ 2013-01-12 16:58 yefeng1627 阅读(258) 评论(0) 推荐(0)
摘要:状态 dp( i, j ) 表示 拿出i块巧克力,桌面上剩余j块的概率 若再拿出一块巧克力,则可能出现两种情况 一,一种是,从 桌面已出现的 J 种取 一种,然后被吃掉,则桌面总数量减少1,得到状态 dp(I+1,J-1),概率为 DP(I,J)*J/C, 二,一种是,从 桌面上未出现的C-J种取 一种,然后桌面数量增加一个,得到状态DP(I+1,J+1),概率为DP(I,J)*(C-J)/C 注意到 第一种情形出现的条件是 J-1 >= 0 ,第二种出现条件为 J+1 <= C 另外,我们知道当 M 》 C ,以及 M,N奇偶性不同时,概率必定为0. 至于N = 1e... 阅读全文
posted @ 2013-01-11 22:14 yefeng1627 阅读(355) 评论(0) 推荐(0)
摘要:依据题目要求,则任意满足要求的N有如下关系 , 其中 ( x, y, z ) 为自然数 那么我们需要前1500个. 则可以通过枚举 x, y, z 来得出. 问题就转换成了如何枚举 x, y, z 使其不重复,且按照从小到大的顺序得出. 假定,我们已经求得了第 Ai 个 Ugly Number 那么, Ai*2,Ai*3,Ai*5 也必定是 Ugly Number, 这也确实是这样.但是我们想要知道的是其顺序大小关系. 第i个Ugly Number 为Ai, i+1个Ugly Number该如何求呢. 它必定是前面已求得的一个数 Aj, 通过 *2, *3, *5 ... 阅读全文
posted @ 2013-01-11 18:43 yefeng1627 阅读(178) 评论(0) 推荐(0)
摘要:题目题意异常恶心,难以理解...... 呵呵.....不过题意是 Lyush大神 花费一小时看明白后透露给笔者的, 到现在依然YM此大婶当中...... 先说说题目大意: 一颗完全二叉树,有 N ( n <= 1024,且必定为2的整数幂,意味着是一颗完全二叉树 ) 个叶子节点,每一个节点都含有一个长度为 LL ( L <= 1000 ) 的串 ( 串仅由大写字母构成), 现仅仅知道N个叶子节点串的组成.其他节点串不知道. 但我们知道,直接父节点相同的两个子节点,其对应位置不同则花费为1. 整棵树花费最小. 让你求,整棵树的最小花费, 以及根节点的可能串元素... 阅读全文
posted @ 2013-01-11 17:04 yefeng1627 阅读(346) 评论(1) 推荐(0)
摘要:解决此类问题常见思路: 为求以 A1, A2, ... , AK 为前K项的所有栏杆字典排序第K小的序列. 这里给出其他牛人的介绍先抛开此题,用最简单的全排列问题来说明这种方法。如1,2,3,4的全排列,共有4!种,求第10个的排列是?先试首位是1,后234有3!=6种<10,说明1偏小,转化成以2开头的第(10-6=4)个排列,而3!=6 >= 4,说明首位恰是2。第二位先试1(1没用过),后面2!=2个<4,1偏小,换成3(2用过了)为第二位,总编号也再减去2!,剩下2了。而此时2!>=2,说明第二位恰好是3。第三位先试1,但后面1!<2,因此改用4。末位则是 阅读全文
posted @ 2013-01-10 18:48 yefeng1627 阅读(173) 评论(0) 推荐(0)
摘要:当总数量 N 为奇数的时候, 因为N为奇数,N+1变成1,同样为奇数. 则意味着奇偶位置可以相互转换. 但是当N为偶数的时候,因为N为偶数,N+1变成1,转换成了奇数. 奇数位置,和偶数位置不相关. 因为我们的置换规则是 奇数位置和奇数位置对换, 偶数位置和偶数位置对换. 那么当N为奇数时,可以转换成任意形态. 但是当N为偶数时,仅仅当奇数位置上的黑点数量与偶数上的黑点数量相差小于等于1的时候,才可转换成符合条件的情况.解题代码View Code #include<stdio.h>#include<string.h>#include<stdlib.h>int 阅读全文
posted @ 2013-01-08 17:52 yefeng1627 阅读(170) 评论(0) 推荐(0)
摘要:最终结果为奇数,所以必败点是奇数情况. 因为报下一天或者下一个月都是奇数转换成偶数,或者偶数转换成奇数. 意味这得到的数字是一个奇数,则必败. 有两个特殊情况. 就是 9,30 和 11.30 ,当前都是奇数形式,下一天同样保持奇数形式,但是下个月则变成偶数. 所以在这里可以改变自己面临的 必败局面. 解题代码:View Code #include<stdio.h>int main(){ int T, a,b,c; scanf("%d",&T); while( T-- ) { scanf("%d%d%d",&a,&b, 阅读全文
posted @ 2013-01-06 22:48 yefeng1627 阅读(178) 评论(0) 推荐(0)
摘要:我们根据置换群的性质,知道其经过 K 次置换回到最初位置,此时 K,为N元组的循环因子 a1,a2,...,ai 的最小公倍数。 现在题目要求输入N,求出最大的K,当K情况不唯一,则输出字典序最小,那么题目就转换成将 N 分解成 X个数,其最小公倍数最大的情况了。 这里关于分解N的处理,也是参考一神牛,(再次ORZ一下) 因为 N <= 100 ,我们可以使用 DP 来得到。 F[ i ][ j ] = Max { F[ i ][ j ] , LCM( F[ i-k ][ j ], k ) } 定义 F[ i ][ j ] 表示 和为 i 分解为 j 个数时 的最小公倍数最大的值... 阅读全文
posted @ 2013-01-04 21:50 yefeng1627 阅读(221) 评论(0) 推荐(0)
摘要:无聊水水题。发现水题也不水,我勒了去....import java.math.*;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner cin = new Scanner( System.in ); BigDecimal R, c; int n; while( cin.hasNext() ) { R = cin.nextBigDecimal(); ... 阅读全文
posted @ 2013-01-04 17:40 yefeng1627 阅读(148) 评论(0) 推荐(0)

Launch CodeCogs Equation Editor