各类模板(日常更新) Tire and AC自动机 树的重心 点分治 gcd&exgcd 线性筛 网络流

这篇Blog是一些板子。。。。。。。。。。。。。。

[TOC]

#高精 + - *

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

#define II long long
#define IL inline
#define R register
#define I 1010
#define PI 10
using namespace std;

template < typename T > IL void (R T &a) {
R char c=getchar (); R T w=1, p=0;
while (!isdigit(c)) { if(c=='-') w=-1; c=getchar (); }
while (isdigit(c)) { p=p*10+c-'0'; c=getchar (); }
a=w*p;
}



char s[I];

struct NU {
II a[I];
NU () {memset(a,0,sizeof a);}

IL void in() {
scanf("%s",s+1);
a[0]=strlen(s+1);
for(R II i=a[0];i;i--) a[a[0]-i+1]=s[i]-'0';
}

friend NU operator + (NU a1,NU a2) {
R NU c; R II jin=0; c.a[0]=max(a1.a[0],a2.a[0]);
for(R II i=1;i<=c.a[0];i++)
{
c.a[i]=a1.a[i]+a2.a[i]+jin;
jin=c.a[i]/PI;
c.a[i]%=PI;
}
while (jin) c.a[++c.a[0]]=jin%PI, jin/=PI;
return c;
}

friend NU operator - (NU a1,NU a2) {
R NU c=a1;
for(R II i=1;i<=c.a[0];i++) c.a[i]=a1.a[i]-a2.a[i];
for(R II i=1;i<=c.a[0];i++)
if(c.a[i]<0) {
c.a[i]+=PI;
c.a[i+1]--;
}
while (!c.a[c.a[0]] && c.a[0]!=1) c.a[0]--;
return c;
}

friend NU operator * (NU a1,NU a2) {
R NU c; R II w;
for(R II i=1;i<=a1.a[0];i++)
for(R II j=1;j<=a2.a[0];j++)
{
w=c.a[i+j-1]+1ll*a1.a[i]*a2.a[j];
c.a[i+j]+=w/PI;
c.a[i+j-1]=w%PI;
}
for(R II i=1;i<=a1.a[0]+a2.a[0];i++) {
if(c.a[i]) c.a[0]=i;
c.a[i+1]+=c.a[i]/PI;
c.a[i]%=PI;
}
return c;
}

IL void out() {
R II wei=a[0];
printf("%1d",a[wei--]);
while (wei) printf("%1d",a[wei--]);
puts("");
}
} a, b, c;

int main()
{
a.in(); b.in();
c=a+b; c.out();
c=a-b; c.out(); // 一般这里a 是大于b 的
c=a*b; c.out();
exit(0);
}

Blog

Tire and AC自动机

Blog

树的重心

Blog

点分治

Blog

gcd&exgcd

Blog

线性筛

Blog

网络流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

#define II int
#define IL inline
#define R register
#define I 123546
using namespace std;

template < typename T > IL void (R T &a) {
R char c=getchar (); R T w=1, p=0;
while (!isdigit(c)) { if(c=='-') w=-1; c=getchar (); }
while (isdigit(c)) { p=p*10+c-'0'; c=getchar (); }
a=w*p;
}



II tot=1,n,m,s,t,ans,Inf=1e8;
II head[I], inq[I], bit[I];
queue <II> Q;

struct UUI { II to,up,flow; } aa[I];
IL void join(R II x,R II y,R II z) {
aa[++tot]=(UUI) {y,head[x],z}; head[x]=tot;
aa[++tot]=(UUI) {x,head[y],0}; head[y]=tot;
}

IL bool bfs() {
for(R II i=1;i<=n<<1;i++) inq[i]=0;
Q.push(s); inq[s]=1;
while (!Q.empty()) {
R II x=Q.front(); Q.pop();
for(R II i=head[x],go;i;i=aa[i].up)
{
go=aa[i].to;
if(!inq[go] && aa[i].flow) {
inq[go]=inq[x]+1;
Q.push(go);
}
}
}
return inq[t];
}

IL II dfs(R II x,R II a) {
if(x==t || !a) return a;
R II now_f=0,f;
for(R II &i=bit[x],go;i;i=aa[i].up)
{
go=aa[i].to;
if(inq[go]==inq[x]+1 && (f=dfs(go,min(aa[i].flow,a)))>0) {
aa[i].flow-=f;
aa[i^1].flow+=f;
a-=f; now_f+=f;
if(!a) return now_f;
}
}
return now_f;
}

int main()
{
//freopen("1.in","r",stdin);

of(n); of(m); of(s); of(t); s+=n;
for(R II i=1;i<=n;i++) join(i,i+n,1);
for(R II i=1,x,y;i<=m;i++) {
of(x); of(y);
join(x+n,y,Inf);
join(y+n,x,Inf);
}

while (bfs()) {
for(R II i=1;i<=n<<1;i++) bit[i]=head[i];
ans+=dfs(s,Inf);
}

printf("%dn",ans);
exit(0);
}