- 博客(64)
- 资源 (1)
- 问答 (2)
- 收藏
- 关注
原创 关于加速
对于下面的式子,我们可以直接枚举d(1-x),那么就会有x/d个f(d),相乘就会得到答案。但是有时候这样处理还是会慢,该如何解决呢?我们可以举个例子 x=6d=1 x/d=6d=2 x/d=3d=3 x/d=2d=4 x/d=1d=5 x/d=1d=6 x/d=1那么个数为x/i的数的个数为i-x/(x/i)+1个 这样就可以较为快速的进行计算
2017-10-10 19:18:48
270
转载 根据递推式构造矩阵
简单的例子Fibonacci数列考虑Fibonacci数列, F(n)=F(n−1)+F(n−2)将右边两项看做是一个列向量的形式,令 Xn−1={Fn−1Fn−2}很容易得到Xn的形式,即 Xn={FnFn−1}现在的任务就是找到一个系数矩阵A,使得AXn−1=Xn,且A需与n无关。 如果能够找到这个A,则易知An−
2017-10-08 12:10:17
921
原创 二分图匹配-匈牙利算法
两个点集,两个点集之间的点有连线,代表有关系(根据题意来进行建边)。现在需要判断能否为每个点都找到匹配。匈牙利算法的思想:对于一个点,每次找到可以匹配的点,就去连接。下一个点如果没有点可以匹配了,那么直接把上一个已经匹配的点做修改,再来寻找能否匹配。int match(){ memset(link,-1,sizeof(link));//link[i]表示i有匹配link[i] f
2017-09-22 20:19:24
261
原创 AC自动机
我们知道KMP是单模式匹配,求一个串在母串中是否出现过。那么AC自动机就是求多模式匹配的算法,判断n个串是否在母串中出现过。AC自动机要用到字典树和失败指针两个很关键的东西,下面来具体说一下要怎么构造。字典树的构造应该是比较容易,一颗以root为根的树,每个节点下面有26个节点,分别代表了a-z的字母;同时还有根据题目需要的一些标志,如该节点是否是单词的结束节点的sum,记录节点到根的长度的len
2017-09-19 20:16:55
328
原创 最长回文字串--MANACHER算法
个人感觉马拉车算法的思想和扩展KMP的思想是相似的。首先对于这个问题,我们可以暴力枚举每个子串,然后判断是否是回文串,时间复杂度大概是O(n^3),我们运用下尺取法的思想,枚举每一个对称轴位置(针对长度的奇偶有所区别),那么时间复杂度会是O(n^2),接着我们如果把字符串转化一下,添加一些未出现过的字符,形成一个长度为奇数的字符串。那么我们只用枚举每一个长度然后判断就好了。所以如何利用已经得到
2017-09-02 11:52:39
233
原创 输入挂
这个东西比赛一般用不到,不过万一用到了呢namespace fastIO {#define BUF_SIZE 100000//fread -> readbool IOerror = 0;inline char nc() {static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;if(
2017-08-24 22:19:38
212
转载 卡特兰数
先上一个比较快O(n)的模板,n的范围是1e6#include #include #include #include #include #define ULL unsigned long longusing namespace std;long long n;const long long M=1000000007;long long inv[1000010];lon
2017-08-24 15:25:23
439
原创 AC自动机
我们知道KMP是单模式匹配,求一个串在母串中是否出现过。那么AC自动机就是求多模式匹配的算法,判断n个串是否在母串中出现过。 AC自动机要用到字典树和失败指针两个很关键的东西,下面来具体说一下要怎么构造。 字典树的构造应该是比较容易,一颗以root为根的树,每个节点下面有26个节点,分别代表了a-z的字母;同时还有根据题目需要的一些标志,如该节点是否是单词的结束节点的sum,记录节点到根的长度的
2017-08-21 15:44:14
202
原创 扩展KMP
扩展KMP算法是用来求txt串每一个后缀与pat的最长公共前缀。举个例子: txt: aaaaba pat: aaaa那么求出的extend[1]=4; extend[2]=3; extend[3]=2; extend[4]=1; extend[5]=0; extned[6]=1;那么我们第一次的是需要算出来的。第二次呢?因为t[1,4]=p[1,4],t[2,4]=p[2,4]
2017-08-20 19:45:28
310
原创 多校8.11 斯特林数,容斥
题意是一个人有姓和名,都是有n个字符组成的。要求一个人的姓何名不能出现相同的字符。现在有m个字符,问你一共可以有多少不同的人。首先我们先学习下斯特林数。第一类Stirling数s(p,k)第一类Stirling数的含义:将p个物体排成k个非空循环排列的种类数。s(p,k)=s(p-1,k-1)+s(p-1,k)*(p-1)。1递推关系的说明:考虑第p个物品,p可以单
2017-08-18 20:07:08
348
转载 筛法求莫比乌斯,欧拉函数
网上关于素数筛的资料很多,这里只是给出弱鸟整理的几个线性筛和应用。最朴素的素数筛——埃拉托斯特尼筛法(Sieve of Eratosthenes) 复杂度 Olognlognint primes[MAXN],tot=0;bool isPrime[MAXN];void getPrime(){ memset(isPrime,true,sizeof(isPrime));
2017-08-18 16:50:11
271
原创 KMP
在YouTube上找了一个视频,通过很详细的讲解,可以说对KMP已经很是理解了。KMP实际上是发现失配的时候,对模式串进行操作,根据保存的next数组,来决定从哪里开始读模式串。所有很关键的就是根据串的前后缀来构造next数组。然后o(m)遍历一遍就可以了。下面代码a就是next数组#include#include#includeusing namespace std;co
2017-08-17 20:54:41
210
原创 求欧拉函数的几种方法
1 如果需要一直使用,可以打表预处理。根据递推的关系式 函数init_phi() 2 O根号n的复杂度: phi()函数 3 筛法先求素数 O(x): x为根号n内的素数 prime_phi()函数includeincludeincludeusing namespace std; typedef long long ll; const int maxn=5e4; bool isprime[
2017-08-17 11:06:39
1817
1
原创 hdu 6129 多校第7场10
这个题当时集全队之力,就是差这么一点就过去了。。题意大概是给一个序列a1,a2,a3...an一次操作bi=a1^a2^..ai。现在求做m次操作后的序列应该是多少。n刚开始想要找规律,发现了规律,却一直道不破(主要是没有想到组合数的系数那一块),最后终于发现是杨辉三角,队友写了主程序,不幸的超时了。后来一直觉得是不是哪里读入的问题,感觉时间复杂度真的不能再简单了呀。。。但是现在想想,
2017-08-16 11:16:41
204
原创 大组合数取模-卢卡斯定理
首先,Lucas(卢卡斯)定理是什么?有什么用?Lucas定理是用来求 C(n,m) mod p,p为素数的值。(注意:p一定是素数)有人会想,C(n,m)不能用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式来递推吗?( 提示:C(n, m) mod p = n!/(m!(n - m)!) mod p )
2017-08-13 18:56:38
722
原创 逆元
对于正整数n,m,如果ax和1modm同余,那么x的最小正整数叫做a模m的逆元。一般来说,如果m为素数,a的逆元为a^(m-2)。这个可由费马小定理得到:设a,p为正整数,p为素数。那么a^(p-1)和1模p同余但是对于p不为素数的情况,可以由扩展欧几里得求出。如果b与c互素,则(a/b)%c=a*b^(phi(c)-1)%c如果b与c不互素,则(a/b)%c=(a
2017-08-09 16:00:03
282
原创 hdu6069
题意:计算从l到r的每个数的k次方的所有因子个数和mod998244353首先一个数可以写出n=a1^p1*a2^p2.. 即n个不同的质因子相乘的形式那么n的因子的数目为(p1+1)*(p2+1)*...比赛的时候是把没个数分解质因子,然后将质因子的幂相乘,但是一直超时。实际上多做了一个步骤:我们没有必要具体的算出来这个数可以用哪几个质因子表示出来。我们只需要看质因子有多少个就好了
2017-08-08 19:51:59
259
原创 2017多校 Balala Power!
当时比赛这个题,wa了次,最后发现思路是有一点问题。今天补题,也是出现了很多错误,哎,还是太菜了,必须要多写代码。题意:将a-z这26个字母用0-25进行赋值。那么对于一个字符串,就可以看作是一个26进制,那么该字符串就可以转化为一个10进制的数,求所有字符串的和的最大值。(如果一个字母被赋值为0,那么该字母不能出现在首位。a这种是可以的)比赛时候的思路是:我把每一个位赋初值0,10000
2017-07-26 20:45:41
279
1
原创 由一道题引发的关于输入输出的总结
这道题要求输入的形式如下abc defdfs deddf.....defdeff上面用一个空行表示输入的结束。然后开启下面的输入。怎么解决这个问题呢?先说说scanf():scanf可以用来输入各种数据类型的变量,自动忽略末尾的回车符。但是scanf的一个问题就是对于scanf("%s%s")这种,字符串间不能有空格如果想要把空格也输入进去,必须用到gets
2017-07-24 19:01:15
219
原创 几何知识
1 已知正方形的2个点,如何求出另外两个点(这里我们以这两个点位边,并且求其右侧正方形)我们根据这个图可以知道x3=x1+y1-y2;y3=y1+x2-x1x4=x2+y1-y2;y4=y2+x2-x1
2017-07-24 15:34:38
173
原创 大数阶乘
可以用java和c++来实现大数的阶乘首先是java,利用类BigInteger类public void main(String args[]){ Scanner in=new Scanner(System.in); BigInteger c[]=new BigInteger[3050]; c[0]=1;c[1]=1; for(int k=2;k{ c
2017-07-24 11:18:15
144
原创 stl
1 vector1.1 vector是在不知道数组需要多大规模下使用的。与数组相同,vector,vector,vector都是可以的。同时可以声明二维数组vectora[maxn],vectoea;三维数组vectora[maxn][maxn],vectora。依次类推1.2 常见的函数用法例如:vectorcc.clear():清楚容器中的所有数据c.empty():判断容器是
2017-07-22 22:15:32
161
原创 关于凸包——Graham扫描法
首先是凸包的第一种解法,graham扫描法。算法的步骤如下:1 首先我们要找到凸包的一个顶点,这个顶点的y坐标要最小,相同的y的情况下,选择更靠左的点2 对给出的顶点集进行排序,按照极角递增的顺序进行排序?如何进行操作呢,我们可以用我们矢量积的性质,如果矢量积为正,b矢量在a矢量的逆时针方向。极角顺序相同的,我们把距离近的那一个排在前面。3 完成排序后,我们将p0,p1入栈,对i=2
2017-07-21 18:57:12
471
原创 计算几何学入门知识
今天正式开始学习计算几何,下面是常用到的一些小知识。1 P(x1,y1), Q(x2,y2),如果R(x,y)在线段PQ上,那么一定会有x=γx1+(1-γ)x2,y=γy1+(1-γ)y22 矢量的叉积具有这样的性质:下面说的P,Q都是指矢量: P*Q=c.如果c小0,说明Q在P的逆时针方向;=0说明P和Q共线,大于0说明Q在P的顺时针方向3 由矢量叉积的性质,我们可以求折线段的拐向
2017-07-21 17:36:00
809
原创 扩展欧几里得
欧几里得也就是辗转相除法是用来求a,b的最大公因数gcd(a,b)的,那么如果d是a,b的最大公因数,那么一点有ax+by=d。如何求解这个二元一次方程,就要用到扩展欧几里得了。下面先给出程序int e_gcd(int a,int b,int &x,int &y)//返回最大公因数{ if(b==0) x=1;y=0;return a; int ans=e_gcd
2017-07-20 12:10:58
194
原创 poj3273
题目大意就是将n个数分成m段,每段和的最大值在所有分法中最小。虽然这是一道很简单的二分,但是暴露出了我写二分时候的很多问题。问题1:每次low=mid+1, high=mid-1。不要忘记那个1问题二:初始的low和high要找清楚问题三: 符号题目条件的值每次都保存下来,只用最后的mid一点是错的#include#includeusing namespace std;
2017-07-20 11:33:13
148
原创 poj1845
题目大意就是让你求A^B所得数的所有因子和%9901这道题用到了数论的2个重要内容1 任意一个合数都可以分解成若干个素数相乘的形式,把相同的素数写成立方的形式,就可以得到n=p1^a1*p2^a2...pn^an2 一个数的因子直接求不好求,但是写出素数相乘的形式,变很简单。n的因子就是(1+p1+p1^2...p1^a1)*(1+p2...)*(1+p3...)那么如何求等比式(
2017-07-19 15:54:08
188
原创 关于组合数学
组合数学最离不开的就是Cnm这个东西了,有时候怎么快速的求变很重要。当n,m都很大的时候,如果直接递归求解做不到那么:最后因为要转化成整型,所以结果要+=0.5才行void C(unsigned int n,unsigned int m){double ans=1.0;while(m>0){ans*=(double)(n--)/(double)(m--)
2017-07-18 15:04:14
241
原创 高斯消元法
高斯消元法是用来求线性方程组的,一般的解法是写出增广矩阵通过列主消元法将增广矩阵化为上三角矩阵根据增广矩阵的秩和系数矩阵的秩来决定解的个数如果有唯一的解,通过迭代求出下面是浮点数,有唯一解的情况增广矩阵为m*(m+1)的矩阵void Gauss(int S[maxn][maxn],int num)//增广矩阵为num*(num+1) {for(int i=1
2017-07-16 15:33:23
392
原创 三分查找
二分查找适用于单调函数,那么三分查找适用于凸函数或者凹函数。也就是说二分是查找区间,相当于一次函数,三分就是二次函数了,求它的极值,怎么做,数学常用的是求导,计算机就用查找。如下图所示:求解的过程是这样的:while(l{int mid=(l+r)/2;int midmid=(mid+r)/2;if(f(mid)>f(midmid)//是求最大值还是最小值 r
2017-07-16 14:36:58
254
原创 约瑟夫环
裸的约瑟夫环问题共n个人,从1开始报数,报到k的人从环中退出,问最后剩下的一个人的编号是多少?这种问题应该这样考虑:假设n个人的编号为0-n-1第一次第k-1的人走了,那么下一轮的时候我们就要重新给这n-1个人编号,第二轮第k个人现在编号为0,那么此时的第k-1个人第一轮的编号应该是(f[1]+k-1)%i2。依次类推,那么最后剩下来的人编号肯定是0.通过向前递推,得到其原来的编号
2017-07-13 14:44:11
156
转载 RMQ算法
概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j2.RMQ算法 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大且查询很频繁时,该算法无法在有效的时间内查询出正解。 本节介绍了一种比较高效的在线算法(ST算法)解决这个问题。所谓在线算
2017-07-12 21:15:10
122
原创 大数相乘
大数相乘问题的基本思想 a*b=c;用d[i]表示每一位数字,a.d[i]*b.d[j]=c.d[i+j]。但是我们需要考虑c.d[i+j]大于10的可能,所以要对它进行取余进位。另一个为题,就是如果算的是a^n方的话,是需要用矩阵快熟幂的。//大数相乘问题a*b=c//思路是d[i]表示乘数的每一位,从0开始。a.d[i]*b.d[j]=c.d[i+j] #include#inc
2017-07-12 20:05:34
192
原创 2017暑假
暑假生活正式开始,还是觉得必须写一点什么,计划点什么,才能让这个暑假充实的过去。昨天刷了一天的题目,真的是感觉到暑假前的雄心壮志都没有了,真的 好难啊。所以最重要的就是要克服自己的懦性,以及不怕任何困难的决心。不需要起多么早,走多么晚。只希望每一天都可以持之以恒,每一天都能有所收获。下面说说计划吧分为两个阶段吧,回家前的一段时间把精力放在学新的算法上面,遇到困难麻烦,做几道思维题,简单的数
2017-07-12 18:34:26
123
原创 关于把数据库放在阿里云上,实现共享
本地的数据库只能实现在自己的机器上访问,别人的电脑无法实现访问。因此通过借助阿里云,把数据库放在阿里云上。从而多人都可以通过阿里云的ip来进行访问操作.在试验过程中,难度最大的就是对阿里云一窍不通,不知从何下手。下面进行一下总结。实现的基本步骤:1 在阿里云上通过浏览器下载mysql install msi2 通过命令行启动 mysql -u root -p登陆本地的mysql
2017-07-05 15:24:46
4575
原创 mysql的共享连接
win系统下,连接别人的MySQL或者让别人链接自己的mysql:打开命令行cmd进入mysql:mysql -u root -pmysql>use mysql; mysql>select host from user where user='root'; mysql>GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED
2017-07-04 19:12:04
437
原创 信号与槽的connect连接函数
1 先理解一下信号与槽我们通常会在改变一个组件的同时,通知另一个组件做出响应。改变一个组件的时候,就会发送一个信号,写好的槽会对这个信号进行匹配,做出相应的相应。槽和信号都是函数,具有类成员函数相同的属性。唯一不同的就是槽可以与信号进行连接。这种通信方式是安全的,因为信号的函数签名必须与信号的函数签名匹配上。实际中,信号函数的参数可以比槽的参数多,因为槽可以自动忽略无用的参数。2 co
2017-06-07 11:04:59
4087
原创 c++ 成员指针
今天在分析老师上课讲的成员变量指针的代码时,遇到了一些问题,下面是通过查找资料进行的一些整理1 成员指针是什么?形象来说,成员指针就是在一个对象内部定位某一个成员的方式。2 如何定义一个成员指针呢‘class A{public:int x;int y;};对于这个类A,我们定义它的成员x的指针int A::*p=&A::x 其中int根据x变量的数据类型来确
2017-06-07 09:37:23
591
原创 关于c++预处理命令的一点总结
1 什么事预处理命令?预处理命令就是在编译器编译之前进行初步的源代码扫描,将产生的新的源代码交给编译器。我们最常见的有宏定义,#include1.1为什么要有#include我们的代码有很多内容使用了c++库函数,或者是包含了工程中的其他类,那么这个时候就需要用预处理的形式把这些文件包含进来。1.2条件编译有些情况下,我们仅仅希望满足条件才会进行编译#ifdef程序
2017-05-27 19:36:10
524
原创 初识Qt,几种写界面的方法
1 我们可以直接在新建项目中选择Application中的Qt Widgets Application。此时Qt会为我们直接生成.ui文件,以及对应得.h头文件,.cpp源文件。那么我们需要做的就只是在ui的设计下添加一些我们想让界面拥有的东西。对应得代码会自动添加。Ctrll +S保存设置后,就可以运行了。2下面我们可以通过手写一个简单的界面。在其他项目中选择Empty qmake Proj
2017-05-27 14:25:44
8436
c语言指针问题和函数调用吧
2016-12-10
sql sever 里的数据输入问题
2016-12-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人