快排

procedure qsort(l,r:longint);
var i,j,t,m:longint;
begin i:=l; j:=r;
m:=a[(i+j) div ];
repeat
while a[i]<m do inc(i);
while m<a[j] do dec(j);
if i<=j then
begin t:=a[i]; a[i]:=a[j]; a[j]:=t;
inc(i); dec(j); end; until i>j;
if i<r then qsort(i,r); if j>l then qsort(l,j); end;

1.数组开两倍

procedure insert(x:longint);
var t,s,v:longint;
begin
len:=len+; f[len]:=x; s:=len;
while (s<>)and(f[s div ]>f[s]) do
begin
v:=f[s div ]; f[s div ]:=f[s]; f[s]:=v;
s:=s div ;
end;
end;
function get:longint;
var t,s,v:longint;
begin
get:=f[]; f[]:=f[len]; len:=len-; t:=;
while (t*<=len)or(t*+<=len) do
begin
if (t*+>len)or(f[t*]<f[t*+])
then s:=t* else s:=t*+;
if f[t]>f[s] then
begin
v:=f[t]; f[t]:=f[s]; f[s]:=v; t:=s;
end
else break;
end;
end;

欧拉函数(单个数值)

function phi(x:longint):longint;
var ans,i:longint;
begin
ans:=x;
for i:= to trunc(sqrt(x)) do
begin
if x mod i= then ans:=ans div i*(i-);
while x mod i= do x:=x div i;
end;
if x<> then ans:=ans div x*(x-);
exit(ans);
end;

欧拉函数(批量处理)

procedure work;
var i,j:longint;
begin
p:=;
for i:= to n do e[i]:=i;
for i:= to n do
if e[i]=i then
begin j:=i;
while j<=n do begin e[j]:=e[j] div i*(i-); inc(j,i); end;
end;
for i:= to n do
begin
if e[i]=i- then begin inc(p); prime[p]:=i; end;
end;
end;

质数筛法

procedure work(n:longint);
var i,j:longint;
begin
num:=;
for i:= to n do g[i]:=true;
for i:= to n do
if g[i]=true then
begin
inc(num); prime[num]:=i;
j:=i*;
while j<=n do begin g[j]:=false; j:=j+i; end;
end;
end;

质因数分解

procedure fenjie(x:longint);
var i,y:longint;
begin
t:=;y:=x;
for i:= to num do
begin
if prime[i]>y div then exit;
if x mod prime[i]= then
begin
inc(t); w[t]:=prime[i];
while x mod prime[i]= do x:=x div prime[i];
end;
if x= then break;
end;
end;

快速幂

function quick(x,n,p:qword):qword;
var ans:qword;
begin
ans:=;
while n> do
begin
if n and > then ans:=cheng(ans,x,p);
x:=cheng(x,x,p);
n:=n>>;
end;
exit(ans);
end;

快速乘

function cheng(x,n,p:qword):qword;
var ans:qword;
begin
ans:=;
while n> do
begin
if n and > then ans:=(ans+x) mod p;
x:=(x+x) mod p;
n:=n>>;
end;
exit(ans);
end;

拓扑排序

for i:= to n do if u[i]= then begin inc(t); f[t]:=i; end;
repeat
x:=f[t]; dec(t); inc(num);
new(p); p:=a[x];
while p<>nil do
begin
y:=p^.data;
dec(u[y]);
if u[y]= then
begin
inc(t); f[t]:=y;
end;
p:=p^.next;
end;
until num=n;

强连通分量tarjan

思路:dfn为遍历到各点的时间,low表示每个点能够追溯到的最早的栈中节点的次序号 instack表示结点是否在栈中。

对图遍历如果x的儿子y没访问过,则访问并用low[y]更行low[x],如果x的儿子y被访问过,则用dfn[y]更新low[x],这样就知道了x最早回溯到的点(在栈中),在栈中low[x]相等的值构成强连通分量。

procedure tarjan(x:longint);
var y:longint; p:point;
begin
inc(s); low[x]:=s; dfn[x]:=s; inc(t); q[t]:=x;
instack[x]:=true;
new(p); p:=a[x];
while p<>nil do
begin
y:=p^.x;
if dfn[y]= then begin tarjan(y); low[x]:=min(low[x],low[y]); end
else if instack[y]=true then low[x]:=min(low[x],dfn[y]);
p:=p^.next;
end;
if dfn[x]=low[x] then
begin
inc(num);
repeat
y:=q[t]; dec(t); f[y]:=x;instack[y]:=false;
until x=y;
end;
end;

主程序

 for i:= to n do begin dfn[i]:=; low[i]:=; w[i]:=; instack[i]:=false; end;
s:=; t:=; num:=;
for i:= to n do if dfn[i]= then tarjan(i);

树的直径

思路:求树上最长路,对于各个点,求出它儿子中最长和次长的链相加。

procedure dfs(x,e:longint);
var p:point; y:longint;
begin
s1[x]:=x; s2[x]:=x; new(p); p:=a[x];
while p<>nil do
begin
y:=p^.x;
if y=e then begin p:=p^.next; continue; end;
dfs(y,x);
if f1[y]+p^.v>f1[x] then
begin
f2[x]:=f1[x]; s2[x]:=s1[x];
f1[x]:=f1[y]+p^.v; s1[x]:=y;
end
else
if f1[y]+p^.v>f2[x] then
begin
f2[x]:=f1[y]+p^.v; s2[x]:=y;
end;
p:=p^.next;
end;
if f1[x]+f2[x]>f1[max]+f2[max] then
max:=x;
end;

kmp算法

  p[]:=; j:=;
for i:= to m do
begin
while (j>)and(b[j+]<>b[i]) do j:=p[j];
if b[j+]=b[i] then inc(j);
p[i]:=j;
end;
j:=; kmp:=;
for i:= to n do
begin
while (j>)and(b[j+]<>a[i]) do j:=p[j];
if b[j+]=a[i] then inc(j);
if j=m then begin inc(kmp); j:=p[j]; end;
end;

LCA

倍增

1.不要忘记dfs后调用work

2.注意枚举2^i时要包含0,注意顺序

procedure work;
var i,j:longint;
begin
for i:= to do
for j:= to n do
f[i+,j]:=f[i,f[i,j]];
end;
function lca(x,y:longint):longint;
var i,t:longint;
begin
if deep[x]<deep[y] then begin t:=x; x:=y; y:=t; end;
for i:= downto do
if ((deep[x]-deep[y])>>i)and = then x:=f[i,x];
if x=y then exit(x);
for i:= downto do
if f[i,x]<>f[i,y] then
begin x:=f[i,x]; y:=f[i,y]; end;
exit(f[,x]);
end;

二分图

染色

function dfs(x,color:longint):boolean;
var p:point; y:longint;
begin
new(p); p:=w[x]; g[x]:=color;
while p<>nil do
begin
y:=p^.x;
if g[y]=color then exit(false);
if (g[y]=)and(not dfs(y,-color)) then exit(false);
p:=p^.next;
end;
exit(true);
end;
function cheak(s:longint):boolean;
var i:longint;
begin
for i:= to n do g[i]:=;
for i:= to n do
if g[i]= then
if not dfs(i,) then exit(false);
exit(true);
end;

组合

费马小定理,快速求C(n,m)的值

procedure make;
var i:longint;
begin
f[]:=; g[]:=;
for i:= to n do
begin
f[i]:=(f[i-]*i) mod num;
g[i]:=g[i-]*quick(i,num-) mod num;
end;
end;
function get(x,y:int64):int64;
var i:longint; t:int64;
begin
if (x=)or(y=)or(x=y) then exit();
exit(((f[x]*g[x-y]) mod num)*g[y] mod num);
end;

同余

ax≡1(mod m)

program asdf;
var
a,m,x,y,t:longint;
function extgcd(a,b:longint;var x,y:longint):longint;
var d:longint;
begin
if b<> then begin d:=extgcd(b,a mod b,y,x); y:=y-(a div b)*x; end
else begin x:=;y:=; d:=a; end;
exit(d);
end;
begin
readln(a,m);
x:=; y:=;
t:=extgcd(a,m,x,y);
writeln((x+m) mod m);
end.

NOIP模板的更多相关文章

  1. NOIP模板总结

    NOIP模板总结 进考场先打一份缺省源: # include <cstdio> # include <iostream> # include <cstring> # ...

  2. NOIP模板整理计划

    先占个坑 [update]noip结束了,弃了 一.图论 1.单源最短路 洛谷P3371 (1)spfa 已加SLF优化 #include <iostream> #include < ...

  3. 【模板】NOIP模板汇总

    图论 数据结构 数学 其他: 洛谷模板:a,b两个字符串,求b串在a串中出现的位置 #include<iostream> #include<cstdio> #include&l ...

  4. noip模板复习

    自己敲模板还是有很多容易错的地方 写在注释里面了 LCA #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = ...

  5. NOIP经典基础模板总结

    date: 20180820 spj: 距离NOIP还有81天 目录 STL模板: priority_queue 的用法:重载<,struct cmpqueue 的用法 stack 的用法vec ...

  6. NOIP常见模板集合

    Preface 这篇博客记录的是我联赛前虽然只有两天了的打板子记录. 只求真的能给我起到些作用吧,一般按照难度排序. 而且从这篇博客开始我会用H3的标题代替H4 为了节约篇幅,以下的代码一般均以cla ...

  7. NOIP前的模板复习和注意事项

    联赛除去今天刚好只有一个星期了,最后一个星期也很关键,要吃好睡好保持心情愉悦.当然也免不了最后的复习计划. 首先是模板,之前还有很多模板没有复习到,这些东西是一定要落实到位的. 每天往后面写一点... ...

  8. NOIP的模板--考前复习

    距离NOIP还有25天 可以去放弃一些巨难得题目去搞一些模板了 -------在校老师的原话 一·快排 虽然可以手打,最好用STL,里面有很多优化,会快很多 #include<iostream& ...

  9. 纪中10日T1 2300. 【noip普及组第一题】模板题

    2300. [noip普及组第一题]模板题 (File IO): input:template.in output:template.out 时间限制: 1000 ms  空间限制: 262144 K ...

随机推荐

  1. 如何安全地跨窗体调用Timer控件 从一个窗体调用控制另外一个窗体的控件

    具体的情况是Form1中有一个Timer2时钟,Timer2时钟事件弹出Warning窗体,点击Warning窗体上面的按钮,重新激活一下Form1中的Timer2.从而实现了从一个窗体调用另外一个窗 ...

  2. Linux系统运维基础测试题

    1    Linux运维基础测试题(第一关) 通过这段时间学习Linux基础命令,为了检测自己对Linux基础命令掌握的情况,从网上整理13到测试题,并将其整理出来供大家参考学习. 1.1    习题 ...

  3. python实现归并排序,归并排序的详细分析

    python实现归并排序,归并排序的详细分析.   学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不 ...

  4. 动态规划----FatMouse’s Speed(HDU 1160)

    参考:https://blog.csdn.net/u012655441/article/details/64920825 https://blog.csdn.net/wy19910326/articl ...

  5. ALVのイベントを取得する方法

    概要 表示されたALVをダブルクリックした時に別画面へ遷移する方法を説明しよう.下記サンプルのように標準トランザクションへ遷移したり.別のALVを表示したりする事が可能である. サンプルコード ABA ...

  6. 单调队列优化dp

    洛谷p3800(单调队列优化DP) 题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了. 然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道 ...

  7. Spring中的设计模式--观察者模式

    spring在容器中使用了观察者模式: 一.spring事件:ApplicationEvent,该抽象类继承了EventObject类,jdk建议所有的事件都应该继承自EventObject. 二.s ...

  8. SXOI2018游记

    day0 动身去太原.太原五中虽然挺小的但是很好看啊qwq(进门口一个"通天堂"(逃 试机.似乎看到了__stdcall!!然而没敢去认orz.linux选手似乎是9个.准考证(一 ...

  9. 【jQuery】 选择器

    [jQuery] 选择器 资料: w3school  http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp 1. 标签选择器 : $(& ...

  10. ubuntu 14.04安装nginx+php

    转自:http://www.cnblogs.com/helinfeng/p/4219051.html 基于最新的Ubuntu 14.04(2014年9月)搭建nginx.php.mysql环境,以下全 ...