随笔分类 - 算法笔记
摘要:欧拉定理(又称费马-欧拉定理):已知a和n为正整数,并且a和p互素,则a^phi(n) ≡1(mod n)。证明: 设集合Z = {X1, X2, X3, .... , Xphi(n)},其中Xi (i = 1, 2, .. phi(n))表示第i个不大于n与n互质的数。 考虑集合S = {a*X1(mod n), a*X2(mod n), ... ,a*Xphi(n) (mod n) },则集合Z = S; 1) 因为a和n互质,Xi和n也互质,所以a*Xi 也与n互质。所以对任意一个Xi,a*Xi (mod n)一定是Z里面的元素; 2)对于任意Xi, Xj, 如果Xi != Xj...
阅读全文
摘要:周冬的《两极相通——浅析最大最小定理在信息学竞赛中的应用》把方法讲的很详细了。几点:1、把平面图G*中每一个面抽象成对偶图G*中的点。2、平面图包含f个面,设边e分割fi, fj,则连边(fi, fj)。3、关于如何区分源点和汇点。可以先连接s和t,得到一个附加面。如下图s->4->7->t->s,s*放到附加面中,t*放到无边界的面中,加以区分。4、建好图后要把(s*, t*)这条边删掉。5、G的面数等于G*的点数,G*的点数等于G的面数6、G与G*边数相同 G*中的环对应G中的割一一对应如图:hdu 3780题意是求最小割。直接套网络流模板会TLE。转换成最短路模型
阅读全文
摘要:对于C(n, m) mod p。这里的n,m,p(p为素数)都很大的情况。就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式递推了。这里用到Lusac定理For non-negative integersmandnand a primep, the followingcongruence relationholds:whereandare the basepexpansions ofmandnrespectively.对于单独的C(ni, mi) mod p,已知C(n, m) mod p = n!/(m!(n - m)!) mod p。显然除法取模,
阅读全文
摘要:一些概念和理解:Suffix(i): 表示从i位置到字符串末尾这个子串,(后缀数组);sa[i]:表示排名为i的子串从哪个位置开始,即排名为i的子串为Suffix(sa[i]);rank[i]:表示在字符串上,第i位置在后缀数组中的排名是多少;height[i]:height[i] = Suffix(sa[i-1]) 和Suffix(sa[i])的最大公共前缀;假设有j、k,且rank[j] < rank[k],则有:Suffix(j)和Suffix(k)的最大公共前缀为height[rank[j] + 1], height[rank[j] + 2], ... , height[ran.
阅读全文
摘要:/*记得以前做cf就吃过这上面的亏,今天队里的比赛又挂了好几次才推 出来。。。晚上整理了一下,分别写了写>= , > , <= , <这四种情况。(== 就 不用写了),测试数据包含最小值和最大值的测试,有些情况结果是非法的,输出为-1 或 n*/ //#pragma comment(linker,
阅读全文
摘要:二分法只适用与线性函数,当函数脱离线性而呈现凸性或者凹性的时候,三分是很有必要的。三分过程如下图:凸函数:凹函数:实现方法:double Calc(double p) { /*...*/}double Solve(double MIN, double MAX) { double Left, Right; double mid, midmid; double mid_area = 0, midmid_area = 0; //*** Left = MIN; Right = MAX; while (Left + eps < Right) { mi...
阅读全文
摘要:胡伯涛的《最小割模想在信息学竞赛中的应用》中讲到了最大密集子图。而这题是一个很裸的最大密集子图。。。定义:无向图G中存在一个子图G‘,使得G‘中|E|/|V|最大。即:分数规划,设一个猜想值g,构造一个新函数h(g) = max{sigma(Xe) - sigma(g*Xv)} (Xe属于边集,Xv属于点集)有:已知:乘以-1得:乘以2化简得:其中C[V', !V']表示的图的最小割。所以可以根据如下方式建图:dv最大为m,所以U = m即可, 1/n <= g <= m/1;同时有一个结论:任意两个密集子图,他们的密度查不小与1/n2另外(摘自Discuss):这
阅读全文
摘要:周冬的《生成树的计数及其应用》论文上讲到过生成树计数的问题。用到的是一个Kirchhoff矩阵,它是这样定义的:a、设一个度数矩阵D,当i == j时,Dij = (i这个节点的度数),否则Dij = 0;b、设一个连通性矩阵A,如果i 和j连通,则Aij等于i到j的边数,否则Aij等于0;Kirchhoff矩阵C = D - A;有了Kirchhoff矩阵这个工具,我们可以引入Matrix-Tree定理:对于一个无向图G,它的生成树个数等于其Kirchhoff矩阵任何一个n-1阶主子式的行列式的绝对值(可以用高斯消元解,线性代数没学好的面壁去。。。-_-!)。所谓n-1阶主子式,就是对于..
阅读全文
摘要:当最短路变成二维,就会发生非常有意思的事情。。。问题:给出u v w,表示从u -> v(双向边)所耗的时间为w,又知道没经过一条边,获利为1(对于一天边可以来回走)。求从start到end点,获利至少为k时用的最小时间。。。如果没有那个k,这个问题直接就是st -> ed的最短路。spfa,dijkstra。。。等等现在可以设 dis[i][j]表示到从st到 i点经过边数为j 时的最短路。然后直接spfa,队列中的每个点保留两个值,节点号,和到这个节点的边数。const int N = 100010;const int M = 5024;struct node { int to
阅读全文
摘要:/*建图用的邻接表,复杂度O(E*logE)*/struct pnode { int num; int len; pnode() {} pnode(int a, int b) : num(a), len(b) {} bool operator < (const pnode tmp) const { return len > tmp.len; }};int dis[N];bool vis[N];int n;void bfs(int s) { priority_queue<pnode> q; q.push(pnode(s, 0)); ...
阅读全文
摘要:For non-negative integersmandnand a primep, the followingcongruence relationholds:whereandare the basepexpansions ofmandnrespectively.
阅读全文
摘要:详见:《算法导论》HDU 43441、长度是N的因子(且大于1小于N),集合中的元素得两两互质2、为了尽可能多的选出,每个L的质因子应当只包含N的一个质因子,L是一个质因子的整数次,所以K的值就是N中不同质因子的个数3、要想和最大,那么使得每个L最大,只要使得质因子的指数最大即可所以用pollard_rho分解N的质因数,然后统计不同的质因子个数K,以及计算所有相同质因子乘积的和S特殊情况:如果N本身是某个质数的整数i次幂,那么K只能等于1,因为L要小于N,所以L最大为该质数的i-1次幂 以前poj上用过这个模板。。。放在这道题上wa到爆了。。。最后发现是没注意上面这种情况。。。吐嘈一下,恶心
阅读全文
摘要:给一个棋盘,里边有许多黑白格子,要求找出一块连续的矩形,似的矩形内部的格子全部为白色,并且面积(周长)最大。王知昆的《浅谈用极大化思想解决最大子矩形问题》里边有讲解。这里给出模板void solve(int x) { //x表示要求矩形的颜色0为黑色,1为白色 int i, j; for(i = 1; i <= m; ++i) { H[i] = 0; L[i] = 1; R[i] = m; } int lm, rm; for(i = 1; i <= n; ++i) { lm = 1, rm = m; for(j ...
阅读全文
摘要:很早看过这个东西,不过今天遇到一道题发现居然没有写笔记。。。这里补上吧。以下是我从某个题的解题报告翻出来的。转载的别人的。。。。以此为例:对于N=8,K=3,8个元素序列1 3 -1 -3 5 3 6 7,窗口大小为3,也就是要求出(1, 3, -1), (3, -1, -3), (-1, -3, 5), (-3, 5, 3), (5, 3, 6), (3, 6, 7)这6个序列中的最小值,结果简单,就是-1, -3, -3, -3, 3, 3.使用单调队列,首先要有一个数据结构structnode {intseq, val; }用于记录队列中的元素及其在输入序列中的顺序。队列的状态是这样维护
阅读全文
摘要:Trie图先看一个问题:给一个很长很长的母串 长度为n,然后给m个小的模式串。求这m个模式串里边有多少个是母串的字串。最先想到的是暴力O(n*m*len(m)) len(m)表示这m个模式串的平均长度。。。显然时间复杂度会很高。。。再改进一些,用kmp让每一模式串与母串进行匹配呢?时间复杂度为O((n + len(m))*m),还算可以。可是还有没有更快的算法呢?编译原理里边有一个很著名的思想:自动机。这里就要用到确定性有限状态自动机(DFA)。可以对这m个模式串建立一个DFA,然后让母串在DFA上跑,遇到某个模式串的终结节点则表示这个模式串在母串上。就像这个图,母串“nano”在上边跑就能到
阅读全文
摘要:http://www.hhanger.com/?p=134http://www.coderplusplus.com/?p=393POJ 2201const int N = 50010;int stack[N];int pre[N], lson[N], rson[N];struct node { int key; int val; int id;} st[N];bool operator < (const node& a, const node& b) { return a.key < b.key;}void init(int n) { memset(stack, .
阅读全文
摘要:大概的思路是线封死一条边i -> j,再找i到j的最短路dis[i][j]。dis[i][j] + w[i][j]就是一个环。找到所有环里的最小值就能得到最小环。不过。。。用dijkstra算单源最短路的话,这个的时间杂度是O(n^4);所以可以用floyd将时间复杂度控制在O(n^3)上。思路是在floyd算法进行松弛的时候就找这个最小环。ans = min(ans, dis[i][j] + w[i][k] + w[k][j]); 这样 k -> i - >.... -> j -> k就得到了一个最小环。具体实现如下:void dfs(int i, int j)
阅读全文
摘要:又是生成树问题。。。次小生成树,顾名思义就是比最小稍微大那么一点点的生成树,^_^方法是:1、找到最小生成树,值为mst2、最小生成树种的点:找到每一个点到其它点的路径上的最大边权值 dp[i][j]表示i到j路径上的最大边权值3、加一条不在最小生成树上的边。比如i - k,同时删除在最小生成树上i -> k路径上最大的一个边权值dp[i][k]; 这样会得到 new_mst,在这些new_mst中找一个最小的,就是次小生成树的值实现上用到一些技巧,代码如下POJ 1679:View Code #include <iostream>#include <cstdio>
阅读全文
摘要:定义:一个有向图,存在从某个点开始的到达所有的的一个最小生成树,则它就是最小树形图。从早晨到现在一直在翻资料,终于理解了一点。朱-刘算法的大概过程如下:1、找到除了root以为其他点的权值最小的入边。用In[i]记录2、如果出现除了root以为存在其他孤立的点,则不存在最小树形图。3、找到图中所有的环,并对环进行缩点,重新编号。4、更新其他点到环上的点的距离,如:环中的点有(Vk1,Vk2,… ,Vki)总共i个,用缩成的点叫Vk替代,则在压缩后的图中,其他所有不在环中点v到Vk的距离定义如下:gh[v][Vk]=min { gh[v][Vkj]-mincost[Vkj] } (1<=j
阅读全文
摘要:首先这是要解决什么问题:一个带权完全图,每条边都有自己的花费值cost[i]和收益值benifit[i],如果用x[i]来代表一条边取或不取,那么求一个生成树。要求:r=(∑cost[i]*x[i] ) / (∑benifit[i]*x[i] )最小。经典题目:POJ2728 - Desert King如何来求解:这里用到了0-1分数规划思想,对于上式可以变形为 z(r)=∑cost[i]*x[i] -r*∑benifit[i]*x[i]。而z(r)=0为我们所求。这里有个非常重要的结论:z(r)为单调递减函数,因此是线性的。于是"我们可以兴高采烈地把z(r)看做以 cost[i]-
阅读全文

浙公网安备 33010602011771号