PS:呃.........由于之前写的博客很水并且拉下了许多次没写决定这次好好地写
集训前半部分的总结:
1day:
第一天的时候还是先来了一套题:
在大部分都做出来的前两道水题中,很不幸,由于第二题很之前一道比较难和烦的有点像,高估了它的难度,就直接跳了,导致了最后只能草草应付只有8分,第三题由于细节太多在删删改改的过程中漏掉了一堆东西,也出现了一堆毛病(像忘记错误输出”不可能“,两边可以重复走。。。。第4道在草稿上推了下就红红火火恍恍惚惚地写出来了,多云转晴这道题目虽然情况想到了但是一直想不出好的方法反反复复改了好多次没用的东西还是超时了,最后一题需要用到逆元,还有其他一些方法,写暴力实在是难实现了只好放弃(水样例),表示还是不是很清楚逆元怎么用。
2day:
第2天讲的是些数论的知识,上课的时候听得比较迷糊,只知道了位运算的的一些东西,关于欧几里德什么的还是在讲解只好上网查才补回一些。(整数质数什么的性质公式实在太多了)
主要的内容:(下方有部分链接)
线性筛:
void seive( int Max ) { memset( isPrime , true , sizeof( isPrime )); isPrime[0 ] = false ; isPrime[1] = false ; for ( int i = 2 ; i <= Max ; i++ ) //遍历筛去所有最大因数是i的合数 {if ( isPrime[i] ) prime[ ++ total ] = i ; //把素数记录下来 //遍历已知素数表中比i的最小素因数小的素数,并筛去合数 for ( int j = 1 ; j <= total && i * prime[j] <= Max ; j++) { isPrime[ i * prime[j] ] = false ; if (!( i % prime[j])) break; //找到i的最小素数 } } }
辗转相除(最大公因数)
inline int gcd(int a,int b) //int !!
{
return (b==0?a:gcd(b,a%b);
}
威尔逊定理:若p为素数,则(p-1)!≡-1(mod p);
威尔逊定理的逆定理也成立,即:若对某一正整数p,有(p-1)!≡-1(mod p),则p一定为素数;
费马小定理:p是素数且(a,p)=1,则ap-1≡1(mod p);
欧拉函数: 1~n中和n互素的元素个数j(n);
求欧拉函数(求j(n)):
int eular(int n)
{int k,res;
k=2; res=n;
while (k*k<=n)
{if (n%k==0)
{res=res*(k-1)/k;
while (n%k==0) n/=k;
}
k++;
}
if (n>1) res=res*(n-1)/n;
return res;
}
求欧拉函数(求j(i),i=1~n):
void eular(int n)
{for(int i=2;i<=n;i++)
{if (!IsPrime[i])
{ prime[++cnt]=i; phi[i]=i-1;}
for(int j=1;j<=cnt;j++)
{ if (prime[j]*i>n) break;
Isprime[prime[j]*i]=1;
if (i%prime[j]==0)
{phi[i*prime[j]]=phi[i]*prime[j]; break;} i含prime[j]因子
else
phi[i*prime[j]]=phi[i]*(prime[j]-1); i不含prime[j]因子
}
}
}
扩展欧几里德:
在辗转相除的时候求a*x+b*y=mx与y的解
通过扩展欧几里德求逆元时 (前提ab互质)
a*x+b*y=1=gcd(a,b)
b=0时x=1,y=0;
x为a的逆元
证:
∵ax≡1(mod=b)
设ax=b*-y+1;
∴ ax+by=1;
证毕
∵gcd(a,b)=gcd(b,a mod b)
∴a*x1+b*y1=gcd(b,a mod b)
a*x1+b*y1=gcd(b,a-(a/b*b))
设 bx2 + (a%b)y2 = gcd(b, a%b) = gcd(a, b)(!!!因为很多博客都没提到百思不得其解浪费了很久时间 感谢 Jaydenouyang dalao 在博客园的博客)
∴ ax1+by1=bx2+(a mod b)y2
ax1+by1=bx2+(a - (a/b)*b)y2
ax2+by2-(a/b)*b*y2=ax1+by1
横等得:
x1=y2
y1=x2-(a/b)*y2
如此反复递归终有b=0时
最后得出x的解求出逆元
链接:
欧几里德及扩展欧几里德(点击打开链接)
埃氏筛法和线性筛(点击打开链接)
威尔逊定理(点击打开链接)
若p为质数,则(p-1)!≡p-1 (mod p).
欧拉定理和费马小定理的介绍(点击打开链接)
若gcd(a,p)=1,则a^φ(p)≡1 (mod p).
若p为质数,则a^p≡a (mod p).
KMP(点击打开链接)
更快的找两个(或多个)字符串的重复部分;
3day:
第三天讲的是manacher算法,是用来判断回文串的,还是后来上网查了下,主要是用一个辅助数组Len[i]表示以字符T[i]为中心的最长回文字串的最右字符到T[i]的长度,比如以T[i]为中心的最长回文字串是T[l,r],那么Len[i]=r-i+1,后来查看接下来的数的最右端是否超过最长的最右端,不超过可以根据对称性判断,只有遇到还没有匹配的位置时才进行匹配,已经匹配过的位置不再进行匹配。
4day:
。。。。。。。。。去参观了上交大和上纽大,基本在车上度过了一天;
5day:
第五天讲的是状态压缩,简而言之就是在DP的时候将状态转化为十进制的数表示二进制来表示状态主要操作用位运算;
6day:
第六天讲的是树的dfs(树不是也图吗?)感觉差不都是可以通用的。还讲了LCA(找最近公共父节点),讲了三种方法(倍增,tarjan,RMQ),还有树上差分;
7day:
第七天讲的是线段树(貌似基本没讲),树状数组(用到位运算)和左偏树(一般上小下大,左子树大于右子树,大的和小的右节点合并(递归),假如右边的到最远的完全二叉树的距离大于左边的,左右交换,主要用于二叉堆合并);
8day:
第八天是ACM“欢乐赛”,表示一直在做第三道,先超时在11,后再39,好像后来卡在更后面,最后换来下方法最终过了,接着就在消极。。最重要的是吃了KFC,是吃了KFC,是吃了KFC;