模板重搭建計劃
之前模板好多青涩的地方,和我现在的风格差别也比较大,现在重新搭一个模板,同时复习模板
一定程度上减少被hack的几率:
1 /* 2 :Zu 3 iB@B@i iGM; 4 i@@B@@@B2 7B@B@B@. 5 @@@@B@B@B@u iM@B@B@B@BL 6 B@B@N OB@@@BY F@@@B@BMM@B@O 7 E@B@B .O@B@B@: :BB@@@B@0U7FB@B@ 8 :@B@B. .@B@B@O YB@B@B@OSYJjuU@B@B 9 @B@B5 rB@B@B7 u@B@B@BNuYj1UFuuB@B@i 10 2@@@@ N@@@@M 5B@B@BBkjYU252511JMB@B1 11 @@B@i :@@@B@ J@B@@@MFLju515151FUJE@B@M 12 F@B@B @@@B@, iB@B@@B1YJ12F152F1511JPB@B@ 13 @B@B: EB@@@. . .::::.... O@@B@BSLuU51F151F15152u2@B@B 14 L@@B@ 0B@B@ .:rLuk8MB@B@B@B@B@B@@@B@B@B@B@@@@@B@B@G@@@B@PuY2251F1F151F1F1Fu2B@B@. 15 B@@@Y @B@BB2MB@B@@@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@BMujU52F1F151525151511Y@@@Bi 16 @B@B @B@@@B@@@B@@@B@@@BBZNuu7ri:,,.. B@B@0kN88MB@BEYu252525151F252F1F15UJM@B@J 17 JB@B@ 0@B@@BE17i,. @B@BUvJYJLJjUj125151F152525151F1F55YO@@BX 18 B@B@v .B@B@jUU5252221212F2515251F15252F1F2JE@B@O 19 @B@B. @B@BFJF1F2F2F2F2515151F152F251F5515YEB@B@ 20 .B@@@ B@B@ELU52F152F251525151515252F1F2F2JX@B@B 21 v@B@B vB@B@uj255F15151F2F15252515151F1S15JNB@B@ 22 PB@BX @B@BBYu2F1F1F2F15152F2515151F152F1jP@B@B 23 B@B@v @B@BBjJu5251S25151F15251515151F15JNB@@B 24 BB@@: @B@B@XYL2UF151F15151F2F251F2F251j0@B@B 25 B@B@i @B@B@BPJJJU251111152525152121Uuv1B@B@B. 26 FB@B@B vB@B@B@ZSjjLujUu1U1u2u2uuJJLj2XZ@@@B@@: 27 @B@B@u v@@@B@B@MOXkuujuJjJuu55qEMB@@@B@B@B@Bi 28 :@B@B@ :P@B@B@@@B@B@B@B@B@B@@@B@B@B@U L@B@Bi 29 r@B@BE .vO@@B@B@B@B@B@B@B@B@MU: Y@B@B, 30 r@B@Bu ,rL52F15Uv;: k@B@B 31 ,@@@BJ :BB1 B@B@M 32 . @B@BP .5X, @B@B@Bv B@B@: 33 r@B@@@@Mu: BB@B@ .B@B@ .8B@B@B@BF, uB@B@ 34 7B@B@B@@@B@B8B@@@ 7B@B@M iMB@B@@@B@Xr. @B@B: 35 .:iJZ@B@B@B@@@k :5@B@B@X ,SB@B@B@B@B@BPYi.. P@B@Z 36 .rB@B@B@BMi r@BONE0EM@B@B@B@B@: i5@B@@@B@B@B@@@B@ :B@B@ 37 @B@B@B@B@O @B@B@B@@@@@B@@@5. :LEB@B@B@B@B: @B@B 38 iB@B@ iB@B7 :ZM@B@B@BO57, .:i B@B@ii2OOk 39 M@B@2 @B@B@B@B@@@ 40 @B@B. .jOM07 .UB@B@B@B@@@B@r 41 .B@B@ MB@B@@@B7 M@B@B@B@Bi 42 r@B@B 7O@@BJ SB@B@B@B@B. PB@BP@@B@ 43 uB@BO @@@B@B@Br 8@@@B@B@B@: @B@B 44 S@@@F @B@B@B@B@@ .B@B@B@B@B ZB@Bk 45 SB@B1 B@B@B@B@@@ 5@B@B@7 B@B@. 46 v@B@k .B@@@@@B@r 2@B@B 47 vB@B@:r7; vBB@BF @B@B: 48 :71Z@B@B@B@B@B@B@BM 8B@BE 49 v@B@B@B@@@B@B@@@B@B@B@r @B@B@B@@@: 50 @B@B@B@BMFJi: MB@BJ .B@B@B@B@@@B@Ov 51 .7: :@B@@ ;@@B@B@B@B@@@@2 52 B@B@v Z@@@B ,LMB@B@B@r 53 rB@B@ B@B@B .EB@B@ 54 @B@BM .B@B@B .M@j 55 @B@B1 rB@@@M 56 :@B@Bj i8B@B@B@B@B@Bu GB@B@F 57 i@B@BX M@@@B@@@B@B@B@B@ :@@@B@i 58 i@B@B@ 7B@BFri:,:ivOB@X ,B@B@BM 59 .@B@B@L ,BB@@@Bi 60 qB@B@@7 jB@B@B@L 61 :B@B@B@2. JB@@@B@Bv 62 :@B@B@B@u. ,FB@B@B@BP, 63 .S@B@B@B@0r :jBB@B@B@@@B. 64 :P@B@B@B@BOv, .:7kO@B@B@B@@@B@B@@@ 65 .vBB@B@B@@@B@ONjr:, ,:rYXE@B@@@@@@@B@@@B@MEuri@@@B. 66 J@B@B@B@B@B@@@@@B@B@B@@BM8ENFPFUuUuuuU5XFP0GOMB@B@B@B@B@@@B@B@B@B@B@BMX2vr::::,iB@B@ 67 rB@BM71NMB@B@B@@@B@@@@@B@B@B@B@B@@@B@@@B@@@B@B@B@B@@@B@@@B@BBZqULri:::::::;;rr:r@B@B. 68 u@B@E.,::::iirvLJFFN0OOMM@B@BMO@B@B@@@B@B@@@@@B@MuL2JY77ii:::::::ii;irrrr7r7rr:iB@B@. 69 1B@BZ,;rr;;ii:i::::::::::::,.:Z@@B@B@quLYJqB@B@B@q: ::::ii;;rrrr7rrr7r7rrii::::u@B@B. 70 F@@@P.::i;rrrrrrrrrr;r;r;ri,7@@@@@u. L@@B@BL,rr7r7r7r7rrrrrrii::::iLSBB@B@B@: 71 OB@B@EF7;::,::ii;ir;rrrrr;:7@B@BO ..... N@@@BL:rrrrri;ii:::::irLF8B@B@B@B@B@Bv 72 Z@B@@@B@B@MZ5J7ri:::,:::::,@B@@E .,,:,,.. N@B@B,.:::::i;7j2NO@B@B@B@B@B@E:F@B@P 73 @B@BBB@@@B@B@B@@@B@MOqX1u7UB@B@ .:,,,,.. ,. B@B@k1NOM@B@B@@@B@B@B@B@BSi iB@B@ 74 iB@B@ iYG@@@@B@@@B@B@@@B@B@B@M ,,:,,., rB@B@5. ZB@B@B@B@@@B@@@B@BBF7, @B@B 75 B@B@u :rjSO@@B@B@B@B@B@ .,,,.,. r@@@@@B8M@B@B@B@BOFu;:. B@B@i 76 S@B@B @B@@r ....... :5@B@B@B@B 5B@BB 77 L@@@B, 7@B@Bi . . . .B@B@Bu @B@@. 78 G@B@B; q@B@Bk 7@B@BM G@B@@ 79 B@B@B: L@B@B@O7. .rOB@B@Bu B@B@B 80 qB@M ZB@B@@@B@@@B@B@B@Z .B@@@B 81 7MB@B@B@B@B@Mv S@8. 82 ,:7ri. 83 84 85 ... . .. .. 86 :7FB2 B@B r. :@B. L@@ @B ,.,.,.. 87 .@@@@B@B@B@@@B OB@ L@BO j@@ B@B@B@B@B@B@@@B@ 0PXSXSSJMB@L5FXSSuNB@u5SXSXXZi ,,,,., iB@B@@@@ B@B@B@B@@@B@M 88 @BOurE@B F@B M@@M: O@i :::,:,,.. :@B@O @@@@B@@@B@B@B@B@B@@@B@B@@@B@B2 @B@B@B .@E .B@ .,,.... @BL.. 89 rBB rB@ B@Y vEFL@BNuF2uj u@BX .B5 F5 B@ B@ BE O@. q@ 90 v@B :@@ E@B@B@B@B@@@ XB@P k1jujjSMG0qPqMB@BBB@B@B@v @B B@ @0 @B iLUUuY. ZB, 91 @B@B@B@B@B@B@@@B@B@B@B@B@B@B@B L@u .@B @@@ @B@B@BBOMOM@E2PXqkLi:vi,. @@ B@ Bq 0B, B@@@@@Y N@: 92 ii::,.S@B .:,:,.:@@i.::,. ,i @B. JBq 0@1 iJ r@Y @@ @B @B @1 B@ MB .B7 NB: 93 7B@ @@ :@7 :@@ B@i.:::::: MBO ,::::i MB@ B@O E@B7 B@ B@ Bk @B: O@ ,@r k@, 94 r@M r5 @Bu 5@Bk M@v @B B@B@B@B@B@@@B@B@B@: 5B@. BE r@@F @B @B @E @B OB. :B7 PB: 95 ,:MB@B@B@B@. U@B .@@@. .@B PB8 E@q ;i .O; J B@ B@ B8 :@q E@ .@r k@, 96 B@B@@@B@BPu7, B@ uB@5 v@@S B@ E@E UEkk5277J1YvrBB@r7LYrLUFFkkqE: @B MB @Z B@ PBi YBv NB: 97 0Mui. LBB MB@BB 7B@B@: OBO @B@B@B@B@O@B@B@B@B@O@B@B@@@B@; @@ @@ .@0 @B P@B@B@v N@: 98 v@B qB@Br iXi B@BP 8@O 7@@ iBX @Bi @B@B@B @B7v@BG @B: OB: 99 JB@ JB@B51@B M@@ LB@:rB@Bi GBM ,B@BL r@8 vB@8, .@@ 5@ .@Gq@Bv , Z@: 100 L@B PB@B@J M@B. @@7 i@B@ 0@7 B@M iO@@@r YBB r@B@BY. :. :@q MB: 101 G@N5S@BB Z@S. P@BZ.uB@ ,B@B7 UB@B@@@B: OB@@@5 j@B L@B@B@, iBB FMq1OB@ 102 2B@B@MJ :@B@B@: Sj NFXF5i ,@u qB@ .Y. i@O Y@B@BZ. 103 .. :Ur 104 105 106 107 k :..,, r ii v: ir .L E ..,,:,iivv :.. ,F : u .:iu1 108 .u5BjL:i@@rB@ @k :Bi 7@Bu. uMiNBuL ,@SSuEB5qZUO8 :qN1uM@7777: :v@B i2X@vS@ Bv @ 7B7v7i: 109 .@ ,B UB v@: BX Li O O7u 2 O. 28 .Br,S :B. r7vvrE@7vjLL :B Yiv@:7@j BqiB 7B 110 :LuB27i8 uG .B@r..:ii,,F@: JO1@ 0;F B7@: Lr rOui k. M1::2@:ii@ ,BqF i7@,78 ON.. rB@Y7Z@ 111 2 @r NY55E: r:@B77rBr :2@.v1ik .@., uM ,OG:Bq Br @5::2@,:iB, ,, @ :;vBiii @8ir vJY7 Mu 112 B 8E7 B 0O .@ @i :@B7 Mi 5B5: .P: i,BF j i2 5Yi:F@:ii8 .B7G 77J@rvJ: B7 @ P7 BPG 113 :@k@. @v7rO7 2B B B, i@ @ iJujLr@G77uJU .7r7iNBi;7rr uBL :.:B .. .@ B B BBJ 114 @i 1ZXqkEq0X0 7@P qk0B5 BE 7@ B B7 ZXF2U8@j11k0r YB.rSuuuGjUkX 1P @PXv@i X@: 115 .,. . 116 117 118 119 */
对拍:
1 @echo off 2 3 set path=C:\Windows\System32 4 5 :loop 6 7 data.exe 8 ddd.exe 9 PIA.exe 10 11 fc ddd.out PIA.out 12 13 if not errorlevel 1 goto loop 14 15 pause 16 17 goto loop
linux下的对拍:
1 #!/bin/sh 2 while true; do 3 ./data>ddd.in 4 ./ddd<ddd.in>ddd.out 5 ./pia<ddd.in>pia.out 6 if diff ddd.out pia.out; then 7 echo 没问题 8 else 9 echo 有问题 10 exit 0 11 fi 12 done
线段树:
1 int a[110000]; 2 struct ddd{int tleft,tright,mid,tvalue,delta;}tree[510000]; 3 void delta_push(int x){ 4 tree[x<<1].delta+=tree[x].delta,tree[x<<1|1].delta+=tree[x].delta; 5 tree[x<<1].tvalue+=tree[x].delta,tree[x<<1|1].tvalue+=tree[x].delta; 6 tree[x].delta=0; 7 } 8 void get_SegmentTree(int x,int _left,int _right){ 9 tree[x].tleft=_left,tree[x].tright=_right,tree[x].mid=(_left+_right)>>1,tree[x].delta=0; 10 if(_left==_right) tree[x].tvalue=a[_left]; 11 else{ 12 get_SegmentTree(x<<1,_left,tree[x].mid),get_SegmentTree(x<<1|1,tree[x].mid+1,_right); 13 tree[x].tvalue=max(tree[x<<1].tvalue,tree[x<<1|1].tvalue); 14 } 15 } 16 int search(int x,int _left,int _right){ 17 if(tree[x].tvalue==_left && tree[x].tright=_right) return tree[x].tvalue; 18 else{ 19 delta_push(x); 20 if(_left<=tree[x].mid && _right>tree[x].mid) return max(search(x<<1,_left,tree[x].mid),search(x<<1|1,tree[x].mid+1,_right)); 21 else if(_right<=tree[x].mid) return search(x<<1,_left,_right); 22 else return search(x<<1|1,_left,_right); 23 } 24 } 25 void buff(int x,int _left,int _right,int z){ 26 if(tree[x].tleft==_left && tree[x].tright==_right) tree[x].tvalue+=z,tree[x].delta+=z; 27 else{ 28 delta_push(x); 29 if(_left<=tree[x].mid && _right>tree[x].mid) buff(x<<1,_left,tree[x].mid,z),buff(x<<1|1,tree[x].mid+1,_right); 30 else if(_right<=tree[x].mid) buff(x<<1,_left,_right,z); 31 else buff(x<<1|1,_left,_right,z); 32 } 33 }
SPFA:
1 struct ddd{int next,y,evalue;}e[210000]; int LINK[110000],ltop=0; 2 inline void insert(int x,int y,int z){e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;e[ltop].evalue=z;} 3 int dui[110000],tou=0; 4 bool visited[110000]; 5 int dist[1100000];//注意节点可能会重复进队 6 void SPFA(int x){//本质就是如果这个点可以松弛就松弛,如果不在队里就进队 7 memset(visited,0,sizeof(visited)); 8 memset(dist,0,sizeof(dist)); 9 dui[tou=1]=x; dist[x]=0; 10 for(int k=1;k<=tou;k++){ 11 visited[dui[k]]=false; 12 for(int i=LINK[dui[k]];i;i=e[i].next) 13 if(dist[dui[k]]+e[i].evalue < dist[e[i].y]){ 14 dist[e[i].y]=dist[dui[k]]+e[i].evalue; 15 if(!visited[e[i].y]) dui[++tou]=e[i].y,visited[e[i].y]=true; 16 } 17 } 18 }
并查集:
1 int ji[110000]; 2 int cha(int x){ 3 int _ji=x; 4 while(ji[_ji]!=_ji) _ji=ji[_ji]; 5 while(x!=_ji){ 6 int temp=ji[x]; 7 ji[x]=_ji; 8 x=temp; 9 } 10 return _ji; 11 } 12 int bing(int x,int y){ 13 x=cha(x),y=cha(y); 14 ji[y]=x; 15 }
dinic:
1 const int oo=168430090; 2 struct ddd{int next,y,evalue,fan;}e[1100000]; int LINK[510000],ltop=0; 3 inline void insert(int x,int y,int z){ 4 e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y; 5 e[ltop].evalue=z;e[ltop].fan=ltop+1; 6 e[++ltop].next=LINK[y];LINK[y]=ltop;e[ltop].y=x; 7 e[ltop].evalue=0;e[ltop].fan=ltop-1; 8 } 9 int n,m; 10 int s,t; 11 int dui[510000],tou=0; 12 int level[510000]; 13 bool get_level(){ 14 memset(level,-1,sizeof(level)); 15 dui[tou=1]=s; level[s]=0; 16 for(int k=1;k<=tou;k++) 17 for(int i=LINK[dui[k]];i;i=e[i].next) 18 if(e[i].evalue && level[e[i].y]==-1){ 19 level[e[i].y]=level[dui[k]]+1; 20 dui[++tou]=e[i].y; 21 } 22 return level[t]!=-1; 23 } 24 int max_flow(int x,int y){ 25 if(x==t) return y; 26 int maxflow=0,flow; 27 for(int i=LINK[x];i && maxflow<y;i=e[i].next) 28 if(level[e[i].y]==level[x]+1 && e[i].evalue) 29 if(flow=max_flow(e[i].y,min(y-maxflow,e[i].evalue))){ 30 maxflow+=flow; 31 e[i].evalue-=flow,e[e[i].fan].evalue+=flow; 32 } 33 if(!maxflow) level[x]=-1; 34 return maxflow; 35 } 36 int dinic(){ 37 int bowl=0,flow; 38 while(get_level())while(flow=max_flow(s,oo))bowl+=flow; 39 return bowl; 40 }
快速幂:
1 long long fast_mi(long long x,long long y){ 2 long long base=x,z=1; 3 while(y){ 4 if(y&1) z*=base; 5 base*=base; 6 } 7 return z; 8 }
SBT:
1 struct dcd{int lchild,rchild,size,tvalue;}tree[110000]; int ttop=0,root=0; 2 void left_rotate(int &x){ 3 int y=tree[x].rchild; 4 tree[x].rchild=tree[y].lchild; 5 tree[y].lchild=x; 6 tree[y].size=tree[x].size; 7 tree[x].size=tree[tree[x].lchild].size+tree[tree[x].rchild].size+1; 8 x=y; 9 } 10 void right_rotate(int &x){ 11 int y=tree[x].lchild; 12 tree[x].lchild=tree[y].rchild; 13 tree[y].rchild=x; 14 tree[y].size=tree[x].size; 15 tree[x].size=tree[tree[x].lchild].size+tree[tree[x].rchild].size+1; 16 x=y; 17 } 18 void smaintain(int &x,bool _flag){ 19 if(!_flag){ 20 if(tree[tree[tree[x].lchild].lchild].size>tree[tree[x].rchild].size) right_rotate(x); 21 else if(tree[tree[tree[x].lchild].rchild].size>tree[tree[x].rchild].size) left_rotate(tree[x].lchild),right_rotate(x); 22 else return ; 23 } 24 else{ 25 if(tree[tree[tree[x].rchild].rchild].size>tree[tree[x].lchild].size) left_rotate(x); 26 else if(tree[tree[tree[x].rchild].lchild].size>tree[tree[x].lchild].size) right_rotate(tree[x].rchild),left_rotate(x); 27 else return ; 28 } 29 smaintain(tree[x].lchild,false),smaintain(tree[x].rchild,true); 30 smaintain(x,true),smaintain(x,false); 31 } 32 void insert(int &x,int _value){ 33 if(!x){ 34 x=++ttop; 35 tree[x].lchild=tree[x].rchild=0; 36 tree[x].size=1; 37 tree[x].tvalue=_value; 38 } 39 else{ 40 tree[x].size++; 41 if(_value<=tree[x].tvalue) insert(tree[x].lchild,_value); 42 else insert(tree[x].rchild,_value); 43 smaintain(x,_value>tree[x].tvalue); 44 } 45 } 46 void remove(int &x,int z){ 47 if(!x) return ; 48 tree[x].size--; 49 if(z<tree[x].tvalue) remove(tree[x].lchild,z); 50 else if(z>tree[x].tvalue) remove(tree[x].rchild,z); 51 else{ 52 if(!tree[x].lchild && !tree[x].rchild) x=0; 53 else if(!(tree[x].lchild*tree[x].rchild)) x=tree[x].lchild+tree[x].rchild; 54 else{ 55 int temp=tree[x].rchild; 56 while(tree[temp].lchild) temp=tree[temp].lchild; 57 tree[x].tvalue=tree[temp].tvalue; 58 remove(tree[x].rchild,tree[temp].tvalue); 59 } 60 } 61 } 62 int select(int &x,int y){ 63 if(!x) return -1; 64 if(y<=tree[tree[x].lchild].size) return select(tree[x].lchild,y); 65 else if(y>tree[tree[x].lchild].size+1) return select(tree[x].rchild,y-tree[tree[x].lchild].size-1); 66 else return tree[x].tvalue+bowl; 67 } 68 int rank(int &x,int y){//不知道对不对,应该对了(吧) 69 if(!x) return -999999999; 70 if(y<tree[x].tvalue) return search(tree[x].lchild,y); 71 else if(y>tree[x].tvalue) return search(tree[x].rchild,y)+tree[tree[x].lchild].size+1; 72 else return tree[tree[x].lchild].size+1; 73 }
kmp:
1 char s[110000]; int n=0; 2 char a[110000]; int l=0; 3 int next[110000]; 4 void get_next(){ 5 int temp=next[0]=-1; 6 for(int i=1;i<n;i++){ 7 while(temp>-1 && s[temp+1]!=s[i]) temp=next[temp]; 8 temp+=(s[temp+1]==s[i]); 9 next[i]=temp; 10 } 11 } 12 int kmp(){ 13 int temp=-1; 14 for(int i=0;i<l;i++){ 15 while(temp>-1 && s[temp+1]!=a[i]) temp=next[temp]; 16 temp+=(s[temp+1]==a[i]); 17 if(temp==n-1) return i;//temp=next[temp]; 18 } 19 }
万进制(输入,乘法,输出,除单精):
1 乘法: 2 const int ss=10000; 3 char _a[110],_b[110]; int _la=0,_lb=0; 4 int a[110],b[110],la=0,lb=0; 5 int c[110],lc=0; 6 void multiply(){ 7 lc=la+lb-1; 8 for(int i=1;i<=la;i++) 9 for(int j=1;j<=lb;j++){ 10 c[i+j-1]+=a[i]*b[j]; 11 c[i+j]+=c[i+j-1]/ss,c[i+j-1]%=ss; 12 } 13 //for(int i=1;i<=lc;i++) c[i+1]+=c[i]/ss,c[i]%=ss;最后再处理容易爆掉 14 while(c[lc+1]) lc++,c[lc+1]+=c[lc]/ss,c[lc]%=ss; 15 } 16 17 输入: 18 19 scanf("%s%s",_a+1,_b+1); _la=strlen(_a+1),_lb=strlen(_b+1); 20 for(int i=_la;i>=1;i-=4){ 21 la++; 22 for(int j=max(i-3,1);j<=i;j++) 23 a[la]=(a[la]<<3)+(a[la]<<1)+_a[j]-'0'; 24 } 25 for(int i=_lb;i>=1;i-=4){ 26 lb++; 27 for(int j=max(i-3,1);j<=i;j++) 28 b[lb]=(b[lb]<<3)+(b[lb]<<1)+_b[j]-'0'; 29 } 30 if(!a[1] || !b[1]){ cout<<0<<endl; return 0;} 31 32 输出: 33 34 cout<<c[lc]; 35 for(int i=lc-1;i>=1;i--) printf("%04d",c[i]); 36 cout<<endl; 37 38 除单精: 39 void division(int z){ 40 lc=la-(a[la]<z); 41 for(int i=la;i>=1;i--){ 42 c[i]=a[i]/z; 43 a[i-1]+=(a[i]%z)*ss; 44 } 45 for(int i=1;i<=lc;i++) c[i+1]+=c[i]/ss,c[i]%=ss; 46 while(c[lc+1]) lc++,c[lc+1]+=c[lc]/ss,c[lc]%=ss; 47 }
筛欧拉函数:
1 void shai(){ 2 memset(kang,0,sizeof(kang)); 3 phi[1]=1; 4 for(int i=2;i<=n;i++){ 5 if(!kang[i]){ phi[i]=i-1; zhi[++ztop]=i;} 6 for(int j=1;j<=ztop && zhi[j]*i<=n;j++){ 7 kang[i*zhi[j]]=true; 8 if(!(i%zhi[j])){ phi[i*zhi[j]]=phi[i]*zhi[j]; break;} 9 phi[i*zhi[j]]=phi[i]*phi[zhi[j]]; 10 } 11 } 12 }
(小根)堆:
1 int hheap[110000],size=0; 2 void push(int x){ 3 hheap[size]=x; 4 int current=size,father=(size-1)>>1; 5 while(hheap[current]<hheap[father]){ 6 swap(hheap[current],hheap[father]); 7 current=father,father=(current-1)>>1; 8 } 9 size++; 10 } 11 void updata(int x){ 12 int lchild=(x<<1)+1,rchild=(x<<1)+2; 13 int min_id=x; 14 if(lchild<size && hheap[lchild]<hheap[min_id]) min_id=lchild; 15 if(rchild<size && hheap[rchild]<hheap[min_id]) min_id=rchild; 16 if(min_id!=x){ 17 swap(hheap[x],hheap[min_id]); 18 updata(min_id); 19 } 20 } 21 void pop(){ 22 swap(hheap[0],hheap[size-1]); 23 size--; 24 updata(0); 25 }
tarjian:
1 int dfn[110000],low[110000],dfs_cnt=0; 2 bool visited[110000]; 3 int zhan[110000],top=0; 4 int group[110000],group_cnt=0; 5 bool is[110000]; 6 void tarjian(int x,int _father){ 7 visited[x]=true; 8 dfn[x]=low[x]=++dfs_cnt; 9 zhan[++top]=x; 10 for(int i=LINK[x];i;i=e[i].next){ 11 if(!dfn[e[i].y]){ 12 tarjian(e[i].y,x); 13 low[x]=min(low[x],low[e[i].y]); 14 if(low[e[i].y] >= dfn[x]) is[x]=true; 15 } 16 else if(visited[e[i].y]) 17 low[x]=min(low[x],dfn[e[i].y]); 18 } 19 if(dfn[x]==low[x]){ 20 group_cnt++; 21 int tmep; 22 do{ 23 temp=zhan[top--]; 24 group[temp]=group_cnt; 25 visited[temp]=false; 26 }while(temp!=x); 27 } 28 }
费用流:
1 int read(){int z=0,mark=1; char ch=getchar(); 2 while(ch<'0'||ch>'9'){if(ch=='-')mark=-1; ch=getchar();} 3 while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0'; ch=getchar();} 4 return z*mark; 5 } 6 const int oo=168430090; 7 struct ddd{int next,y,evalue,rev,cost;}e[1100000]; int LINK[510000]; 8 inline void insert(int x,int y,int z,int _cost){ 9 e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].evalue=z;e[ltop].rev=ltop+1;e[ltop].cost=_cost; 10 e[++ltop].next=LINK[y];LINK[y]=ltop;e[ltop].evalue=0;e[ltop].rev=ltop-1;e[ltop].cost=-_cost; 11 } 12 int dist[510000]; 13 int QUEUE[510000],head=0; bool visited[510000]; 14 int last[510000],last_e[510000]; 15 bool spfa(){ 16 memset(visited,0,sizeof(visited)); 17 memset(dist,10,sizeof(dist)); 18 QUEUE[head=1]=s; dist[s]=0; 19 for(int k=1;k<=head;k++){ 20 for(int i=LINK[QUEUE[k]];i;i=e[i].next) 21 if(e[i].evalue && dist[QUEUE[k]]+e[i].cost<dist[e[i].y]){ 22 dist[e[i].y]=dist[QUEUE[k]]+e[i].cost; 23 last[e[i].y]=QUEUE[k],last_e[e[i].y]=i; 24 if(!visited[e[i].y]) QUEUE[++head]=e[i].y,visited[e[i].y]=true; 25 } 26 visited[QUEUE[k]]=false; 27 } 28 return dist[t]; 29 } 30 int cost_flow(){ 31 int bowl=0; 32 while(spfa()){ 33 int min_flow=oo; 34 for(int i=t;i!=s;i=last[i]) min_flow=min(min_flow,e[last_e[i]].evalue); 35 for(int i=t;i!=s;i=last[i]){ 36 bowl+=min_flow*e[last_e[i]].cost; 37 e[last_e[i]].evalue-=min_flow,e[e[last_e[i]].rev].evalue+=min_flow; 38 } 39 } 40 return bowl; 41 }
高斯消元
1 int gauss(){ 2 int now=1; 3 for(int i=1;i<=n;i++){ 4 int temp=now; 5 while(temp<=n && !(double_abs(a[temp][i])>eps)) temp++; 6 if(temp>n) continue; 7 if(temp!=now) 8 for(int j=1;j<=n+1;j++) swap(a[temp][j],a[now][j]); 9 double c=a[now][i]; 10 for(int j=1;j<=n+1;j++) a[now][j]/=c; 11 for(int j=1;j<=n;j++)if(j!=now){ 12 c=a[j][i]; 13 for(int k=1;k<=n+1;k++) 14 a[j][k]-=c*a[now][k]; 15 } 16 now++; 17 } 18 }
树状数组+二维树状数组(结合这两个可以脑补出高维树状数组?):
1 //===============一维================== 2 3 int e[41000],lowbit[41000]; 4 void get_lowbit(){for(int i=1;i<=32001;++i)lowbit[i]=i&-i;} 5 int query(int x){ 6 int bowl=0; 7 while(x) bowl+=e[x],x-=lowbit[x]; 8 return bowl; 9 } 10 void modify(int x){while(x<=32001) e[x]++,x+=lowbit[x];} 11 12 //===============二维================== 13 14 long long e[1100][1100]; int lowbit[1100]; 15 void get_lowbit(){for(int i=1;i<=n;++i)lowbit[i]=i&-i;} 16 long long query(int x,int y){ 17 if(x==0 || y==0) return 0; 18 long long bowl=0; 19 for(int i=x;i;i-=lowbit[i])for(int j=y;j;j-=lowbit[j]) bowl+=e[i][j]; 20 return bowl; 21 } 22 void modify(int x,int y,long long z){ 23 for(int i=x;i<=n;i+=lowbit[i])for(int j=y;j<=n;j+=lowbit[j]) e[i][j]+=z; 24 }
权值线段树套区间线段树,可以求动态区间第k大(这个代码求的区间第k大但是修改有点不一样,来自BZOJ3110):
1 int n,m; int N; 2 struct dcd{int sleft,sright,mid,root;}tree[1700000]; 3 struct ddc{int mid,lchild,rchild,delta; long long svalue;}tree_2[21000000]; 4 //数字个数最坏5e4*5e4会爆int 5 int tree_cnt=0; 6 int new_node(int x){ 7 tree_2[x].lchild=tree_2[x].rchild=tree_2[x].svalue=tree_2[x].delta=0; 8 return x; 9 } 10 void get_SegmentTree(int x,int _left,int _right){ 11 tree[x].sleft=_left,tree[x].sright=_right,tree[x].mid=(_left+_right)>>1; 12 tree[x].root=new_node(++tree_cnt); 13 if(_left!=_right){ 14 get_SegmentTree(x<<1,_left,tree[x].mid); 15 get_SegmentTree(x<<1|1,tree[x].mid+1,_right); 16 } 17 } 18 void push_down(int x,int uleft,int uright){ 19 int umid=(uleft+uright)>>1; 20 if(!tree_2[x].lchild) tree_2[x].lchild=new_node(++tree_cnt); 21 if(!tree_2[x].rchild) tree_2[x].rchild=new_node(++tree_cnt); 22 //tree_2[tree_2[x].lchild].svalue+=(tree[x].mid-tree[x].sleft+1)*tree_2[x].delta; 23 //tree_2[tree_2[x].rchild].svalue+=(tree[x].sright-tree[x].mid)*tree_2[x].delta; 24 tree_2[tree_2[x].lchild].svalue+=(umid-uleft+1)*tree_2[x].delta; 25 tree_2[tree_2[x].rchild].svalue+=(uright-umid)*tree_2[x].delta; 26 tree_2[tree_2[x].lchild].delta+=tree_2[x].delta,tree_2[tree_2[x].rchild].delta+=tree_2[x].delta; 27 tree_2[x].delta=0; 28 } 29 void modify_2(int x,int _left,int _right,int uleft,int uright){ 30 int umid=(uleft+uright)>>1; 31 if(uleft==_left && uright==_right){ 32 tree_2[x].svalue+=uright-uleft+1,tree_2[x].delta++; 33 return ; 34 } 35 push_down(x,uleft,uright); 36 if(_left<=umid && _right>umid){ 37 modify_2(tree_2[x].lchild,_left,umid,uleft,umid); 38 modify_2(tree_2[x].rchild,umid+1,_right,umid+1,uright); 39 } 40 else if(_right<=umid) modify_2(tree_2[x].lchild,_left,_right,uleft,umid); 41 else modify_2(tree_2[x].rchild,_left,_right,umid+1,uright); 42 tree_2[x].svalue=tree_2[tree_2[x].lchild].svalue+tree_2[tree_2[x].rchild].svalue; 43 //这句忘了QAQ 44 //if(tree_2[x].svalue<_value) cout<<"fuck!!!"<<" "<<x<<endl; 45 } 46 void modify(int x,int y,int _left,int _right){ 47 modify_2(tree[x].root,_left,_right,1,n); 48 if(tree[x].sleft==tree[x].sright) return ; 49 if(y<=tree[x].mid) modify(x<<1,y,_left,_right); 50 else modify(x<<1|1,y,_left,_right); 51 } 52 long long query_2(int x,int _left,int _right,int uleft,int uright){ 53 int umid=(uleft+uright)>>1; 54 if(uleft==_left && uright==_right) return tree_2[x].svalue; 55 push_down(x,uleft,uright); 56 if(_left<=umid && _right>umid) 57 return query_2(tree_2[x].lchild,_left,umid,uleft,umid)+query_2(tree_2[x].rchild,umid+1,_right,umid+1,uright); 58 else if(_right<=umid) return query_2(tree_2[x].lchild,_left,_right,uleft,umid); 59 else return query_2(tree_2[x].rchild,_left,_right,umid+1,uright); 60 } 61 int query(int x,long long y,int _left,int _right){ 62 if(tree[x].sleft==tree[x].sright) return tree[x].sleft; 63 long long rchild_cnt=query_2(tree[x<<1|1].root,_left,_right,1,n); 64 if(y<=rchild_cnt) query(x<<1|1,y,_left,_right); 65 else query(x<<1,y-rchild_cnt,_left,_right); 66 }
splay(来自模板题NOI2005维修序列):
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 int read(){int z=0,mark=1; char ch=getchar(); 9 while(ch<'0'||ch>'9'){if(ch=='-')mark=-1; ch=getchar();} 10 while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0'; ch=getchar();} 11 return z*mark; 12 } 13 const int oo=168430090; 14 #define N 1100000 15 int n,m,a[N],id[N],cnt=0; 16 int fa[N],c[N][2],sum[N],size[N],v[N],mx[N],lx[N],rx[N]; 17 bool tag[N],rev[N]; int root; 18 queue<int> q; 19 void updata(int x){ 20 int l=c[x][0],r=c[x][1]; 21 sum[x]=sum[l]+sum[r]+v[x]; 22 size[x]=size[l]+size[r]+1; 23 mx[x]=max(max(mx[l],mx[r]),rx[l]+v[x]+lx[r]); 24 lx[x]=max(lx[l],sum[l]+v[x]+lx[r]); 25 rx[x]=max(rx[r],sum[r]+v[x]+rx[l]); 26 } 27 void push_down(int x){ 28 int l=c[x][0],r=c[x][1]; 29 if(tag[x]){ 30 rev[x]=tag[x]=0; 31 if(l) tag[l]=1,v[l]=v[x],sum[l]=v[x]*size[l]; 32 if(r) tag[r]=1,v[r]=v[x],sum[r]=v[x]*size[r]; 33 if(v[x]>=0){ 34 if(l) lx[l]=rx[l]=mx[l]=sum[l]; 35 if(r) lx[r]=rx[r]=mx[r]=sum[r]; 36 } 37 else{ 38 if(l) lx[l]=rx[l]=0,mx[l]=v[x]; 39 if(r) lx[r]=rx[r]=0,mx[r]=v[x]; 40 } 41 } 42 if(rev[x]){ 43 rev[x]=0,rev[l]^=1,rev[r]^=1; 44 swap(lx[l],rx[l]),swap(lx[r],rx[r]); 45 swap(c[l][0],c[l][1]),swap(c[r][0],c[r][1]); 46 } 47 } 48 void rotate(int x,int &goal){ 49 int y=fa[x],z=fa[y],l,r; 50 l=(c[y][1]==x); r=l^1; 51 if(y==goal) goal=x; 52 else c[z][c[z][1]==y]=x; 53 fa[c[x][r]]=y,fa[y]=x,fa[x]=z; 54 c[y][l]=c[x][r],c[x][r]=y; 55 updata(y),updata(x); 56 } 57 void splay(int x,int &goal){ 58 int y,z; 59 while(x!=goal){ 60 y=fa[x],z=fa[y]; 61 if(y!=goal) rotate(c[y][0]==x^c[z][0]==y?x:y,goal); 62 rotate(x,goal); 63 } 64 } 65 int search(int x,int y){ 66 push_down(x); int l=c[x][0],r=c[x][1]; 67 while(size[l]+1!=y){ 68 if(y<=size[l]) x=l; 69 else y-=size[l]+1,x=r; 70 push_down(x); l=c[x][0],r=c[x][1]; 71 } 72 return x; 73 } 74 void rec(int x){ 75 if(!x) return ; 76 int l=c[x][0],r=c[x][1]; 77 rec(l),rec(r); q.push(x); 78 fa[x]=c[x][0]=c[x][1]=0; 79 tag[x]=rev[x]=0; 80 } 81 int split(int k,int tot){ 82 int x=search(root,k),y=search(root,k+tot+1); 83 splay(x,root),splay(y,c[x][1]); 84 return c[y][0]; 85 } 86 int query(int x,int tot){ return sum[split(x,tot)];} 87 void modify(int k,int tot,int val){ 88 int x=split(k,tot),y=fa[x]; 89 v[x]=val,tag[x]=1,sum[x]=size[x]*val; 90 if(val>=0) lx[x]=rx[x]=mx[x]=sum[x]; 91 else lx[x]=rx[x]=0,mx[x]=val; 92 updata(y),updata(fa[y]); 93 } 94 void rever(int k,int tot){ 95 int x=split(k,tot),y=fa[x]; 96 if(!tag[x]){ 97 rev[x]^=1; 98 swap(c[x][0],c[x][1]); 99 swap(lx[x],rx[x]); 100 updata(y),updata(fa[y]); 101 } 102 } 103 void erase(int k,int tot){ 104 int x=split(k,tot),y=fa[x]; 105 rec(x); c[y][0]=0; 106 updata(y),updata(fa[y]); 107 } 108 void build(int l,int r,int f){ 109 if(l>r) return ; 110 int mid=(l+r)>>1,now=id[mid],last=id[f]; 111 if(l!=r) build(l,mid-1,mid),build(mid+1,r,mid); 112 v[now]=a[mid],fa[now]=last,updata(now); 113 c[last][mid>=f]=now; 114 } 115 void insert(int k,int tot){ 116 for(int i=1;i<=tot;++i) a[i]=read(); 117 for(int i=1;i<=tot;++i){ 118 if(!q.empty()) id[i]=q.front(),q.pop(); 119 else id[i]=++cnt; 120 } 121 build(1,tot,0); int z=id[(1+tot)>>1]; 122 int x=search(root,k+1),y=search(root,k+2); 123 splay(x,root),splay(y,c[x][1]); 124 fa[z]=y,c[y][0]=z; 125 updata(y),updata(x); 126 } 127 int main(){//freopen("ddd.in","r",stdin); 128 cin>>n>>m; 129 mx[0]=a[1]=a[n+2]=-oo; 130 for(int i=1;i<=n;++i) a[i+1]=read(); 131 for(int i=1;i<=n+2;++i) id[i]=i; 132 build(1,n+2,0); 133 root=(n+3)>>1,cnt=n+2; 134 int x,tot,val; 135 char ch[10]; 136 while(m -->0){//趋向于 137 scanf("%s",ch); 138 if(ch[0]!='M'||ch[2]!='X') x=read(),tot=read(); 139 if(ch[0]=='I') insert(x,tot); 140 if(ch[0]=='D') erase(x,tot); 141 if(ch[0]=='M'){ 142 if(ch[2]=='X') printf("%d\n",mx[root]); 143 else val=read(),modify(x,tot,val); 144 } 145 if(ch[0]=='R') rever(x,tot); 146 if(ch[0]=='G') printf("%d\n",query(x,tot)); 147 } 148 return 0; 149 }
倍增lca:
1 void dfs(int x){ 2 dfs_order[++order_cnt]=x; 3 for(int i=1;(1<<i)<=deep[x];++i) ancestor[x][i]=ancestor[ancestor[x][i-1]][i-1]; 4 for(int i=LINK[x];i;i=e[i].next)if(e[i].y!=ancestor[x][0]){ 5 ancestor[e[i].y][0]=x; deep[e[i].y]=deep[x]+1; 6 //roots[e[i].y]=modify(roots[x],binary_search(a[e[i].y])); 7 dfs(e[i].y); 8 } 9 } 10 int lca(int x,int y){ 11 if(deep[x]<deep[y]) swap(x,y); 12 int _deep=deep[x]-deep[y]; 13 for(int i=0;i<=16;++i)if((1<<i)&_deep) x=ancestor[x][i]; 14 for(int i=16;i>=0;--i)if(ancestor[x][i]!=ancestor[y][i]) 15 x=ancestor[x][i],y=ancestor[y][i]; 16 if(x==y) return x; 17 else return ancestor[x][0]; 18 }
lct:
1 int fa[11000],c[11000][2],st[11000],delta[11000]; 2 bool is_root(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;} 3 void push_down(int x){ 4 int l=c[x][0],r=c[x][1]; 5 if(delta[x]){ 6 delta[x]=0,delta[l]^=1,delta[r]^=1; 7 swap(c[x][0],c[x][1]); 8 } 9 } 10 void rotate(int x){ 11 int y=fa[x],z=fa[y],l,r; 12 l=(c[y][1]==x); r=l^1; 13 if(!is_root(y)) c[z][c[z][1]==y]=x; 14 fa[x]=z,fa[y]=x,fa[c[x][r]]=y; 15 c[y][l]=c[x][r],c[x][r]=y; 16 } 17 void splay(int x){ 18 int top=0; st[++top]=x; 19 for(int i=x;!is_root(i);i=fa[i]) st[++top]=fa[i]; 20 for(int i=top;i;--i) push_down(st[i]); 21 int y,z; 22 while(!is_root(x)){ 23 y=fa[x],z=fa[y]; 24 if(!is_root(y)) rotate(c[y][0]==x^c[z][0]==y?x:y); 25 rotate(x); 26 } 27 } 28 void access(int x){ 29 int last=0; 30 while(x){ 31 splay(x); 32 c[x][1]=last; 33 last=x,x=fa[x]; 34 } 35 } 36 void rever(int x){ access(x),splay(x),delta[x]^=1;} 37 void connect(int x,int y){ rever(x),fa[x]=y,splay(x);} 38 void cut(int x,int y){ 39 rever(x),access(y),splay(y),c[y][0]=fa[x]=0; 40 } 41 int search(int x){ 42 access(x),splay(x); 43 while(c[x][0]) x=c[x][0]; 44 return x; 45 }
自己优化的sbt:
1 int c[210000][2],sz[210000],v[210000],tot=1,root=1; 2 void rotate(int &x,bool mk){ if(!x) return ; 3 int y=c[x][mk^1],l=mk,r=mk^1; 4 c[x][r]=c[y][l]; c[y][l]=x; 5 sz[y]=sz[x]; sz[x]=sz[c[x][l]]+sz[c[x][r]]+1; 6 x=y; 7 } 8 void mt(int &x,bool mk){ if(!x) return ; 9 int l=mk,r=mk^1; 10 if(sz[c[c[x][l]][l]]>sz[c[x][r]]) rotate(x,mk^1); 11 else if(sz[c[c[x][l]][r]]>sz[c[x][r]]) 12 rotate(c[x][l],mk),rotate(x,mk^1); 13 else return ; 14 mt(c[x][l],mk),mt(c[x][r],mk^1); 15 mt(x,true),mt(x,false); 16 } 17 void ist(int &x,int y){ 18 if(!x){ x=++tot; c[x][0]=c[x][1]=0,sz[x]=1,v[x]=y;} 19 else sz[x]++,ist(c[x][y>v[x]],y),mt(x,y>v[x]); 20 } 21 void rmv(int &x,int y){ if(!x) return ; 22 --sz[x]; 23 if(y!=v[x]) rmv(c[x][y>v[x]],y); 24 else if(!c[x][0] && !c[x][1]) x=0; 25 else if(!(c[x][0]*c[x][1])) x=c[x][0]+c[x][1]; 26 else{ 27 int tmp=c[x][1]; 28 while(c[tmp][0]) tmp=c[tmp][0]; 29 v[x]=v[tmp]; rmv(c[x][1],v[tmp]); 30 } 31 } 32 int sch(int x,int y){ 33 while(y!=sz[c[x][1]]+1){ if(x<1) return 0; 34 if(y<=sz[c[x][1]]) x=c[x][1]; 35 else y-=sz[c[x][1]]+1,x=c[x][0]; 36 } 37 return x; 38 } 39 int fd(int x,int y){while(v[x]!=y)x=c[x][y>v[x]]; return x;}
后缀数组(注意height下标从1开始(因为rank从1开始)):
1 int n; char s[1100000]; 2 int rk[1100000],hght[1100000]; 3 int cnt[220],cntrk[1100000]; 4 int rk1[1100000],rk2[1100000]; 5 int sa[1100000],tmpsa[1100000]; 6 int ans[1100000]; 7 void gtsffxrk(){ 8 memset(cnt,0,sizeof(cnt)); 9 for(int i=0;i<n;++i) ++cnt[s[i]]; 10 for(int i=1;i<=210;++i) cnt[i]+=cnt[i-1]; 11 for(int i=0;i<n;++i) rk[i]=cnt[s[i]]-1; 12 for(int l=1;l<n;l<<=1){ 13 for(int i=0;i<n;++i) rk1[i]=rk[i],rk2[i]=(i+l<n)?rk[i+l]:0; 14 //memset(cntrk,0,sizeof(cntrk)); 15 fill(cntrk,cntrk+n,0); 16 for(int i=0;i<n;++i) ++cntrk[rk2[i]]; 17 for(int i=1;i<n;++i) cntrk[i]+=cntrk[i-1]; 18 for(int i=n-1;i>=0;--i) tmpsa[--cntrk[rk2[i]]]=i; 19 //memset(cntrk,0,sizeof(cntrk)); 20 fill(cntrk,cntrk+n,0); 21 for(int i=0;i<n;++i) ++cntrk[rk1[i]]; 22 for(int i=1;i<n;++i) cntrk[i]+=cntrk[i-1]; 23 for(int i=n-1;i>=0;--i) sa[--cntrk[rk1[tmpsa[i]]]]=tmpsa[i]; 24 rk[sa[0]]=0; 25 bool flg=true; 26 for(int i=1;i<n;++i){ 27 rk[sa[i]]=rk[sa[i-1]]; 28 rk[sa[i]]+=(rk1[sa[i]]!=rk1[sa[i-1]] || rk2[sa[i]]!=rk2[sa[i-1]]); 29 if(rk1[sa[i]]==rk1[sa[i-1]] || rk2[sa[i]]==rk2[sa[i-1]]) flg=false; 30 } 31 if(flg) break; 32 } 33 } 34 void gthght(){ 35 int l=0; 36 for(int i=0;i<n;++i)if(rk[i]){ 37 int j=sa[rk[i]-1]; 38 while(i+l<n && j+l<n && s[i+l]==s[j+l]) ++l; 39 hght[rk[i]]=l; 40 l-=(l>0); 41 } 42 }
莫比乌斯函数:
1 int prm[51000],ptt=0; 2 bool flg[51000]; 3 int miu[51000]; 4 void slct(){ 5 memset(flg,0,sizeof(flg)); 6 miu[1]=1; 7 for(int i=2;i<=50000;++i){ 8 if(!flg[i]) prm[++ptt]=i,miu[i]=-1; 9 for(int j=1;prm[j]*i<=50000;++j){ 10 flg[prm[j]*i]=true; 11 if(!(i%prm[j])){ miu[i*prm[j]]=0; break;} 12 miu[prm[j]*i]=-miu[i]; 13 } 14 } 15 }
FFT求高精度乘:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 const int nn=310000; 8 struct cp{ 9 double r,i; 10 cp(double _r=0,double _i=0): r(_r),i(_i){} 11 cp operator+(cp x){return cp(r+x.r,i+x.i);} 12 cp operator-(cp x){return cp(r-x.r,i-x.i);} 13 cp operator*(cp x){return cp(r*x.r-i*x.i,r*x.i+i*x.r);} 14 }; 15 cp a[nn],b[nn],tmp[nn],_x,_y,c[nn]; 16 char s1[nn],s2[nn]; 17 int ans[nn],a1[nn],a2[nn],dig[nn]; 18 int rvs[nn],N,L; 19 void fft(cp x[],int mk){ 20 for(int i=0;i<N;++i) tmp[i]=x[rvs[i]]; 21 for(int i=0;i<N;++i) x[i]=tmp[i]; 22 for(int i=2;i<=N;i<<=1){ 23 cp wn(cos(2*M_PI/i),mk*sin(2*M_PI/i)); 24 for(int k=0;k<N;k+=i){ 25 cp w(1,0); 26 for(int j=k;j<k+i/2;++j){ 27 _x=x[j]; _y=x[j+i/2]*w; 28 x[j]=_x+_y; x[j+i/2]=_x-_y; 29 w=w*wn; 30 } 31 } 32 } 33 if(mk==-1) for(int i=0;i<N;++i) x[i].r/=N; 34 } 35 int main(){//freopen("ddd.in","r",stdin); 36 scanf("%s%s",&s1,&s2); 37 int l1=strlen(s1),l2=strlen(s2); 38 for(N=1,L=0;N<max(l1,l2);N<<=1,++L); N<<=1,++L; 39 for(int i=0;i<N;++i){ 40 int l=0; 41 for(int j=i;j;j>>=1) dig[l++]=j&1; 42 for(int j=0;j<L;++j) rvs[i]=(rvs[i]<<1)|dig[j]; 43 } 44 for(int i=0;i<l1;++i) a1[l1-i-1]=s1[i]-'0'; 45 for(int i=0;i<l2;++i) a2[l2-i-1]=s2[i]-'0'; 46 for(int i=0;i<N;++i) a[i]=cp(a1[i]); 47 for(int i=0;i<N;++i) b[i]=cp(a2[i]); 48 fft(a,1),fft(b,1); 49 for(int i=0;i<N;++i) c[i]=a[i]*b[i]; 50 fft(c,-1); 51 for(int i=0;i<N;++i) ans[i]=int(c[i].r+0.5); 52 for(int i=0;i<N;++i) ans[i+1]+=ans[i]/10,ans[i]%=10; 53 int l=l1+l2-1; 54 while(ans[l]==0 && l>0) --l; 55 for(int i=l;i>=0;--i) printf("%d",ans[i]); 56 cout<<endl; 57 return 0; 58 }
马拉车:
1 for(int i=0;i<n;++i) ss[i<<1]='#',ss[i<<1|1]=s[i]; 2 nn=n<<1; ss[nn]='#'; 3 int mx=0,id=0,ans=0; 4 for(int i=0;i<=nn;++i){ 5 f[i]=(mx>i) ? min(f[2*id-i],mx-i) : 1; 6 while(i>=f[i] && i+f[i]<=nn && ss[i+f[i]]==ss[i-f[i]]) ++f[i]; 7 if(mx<i+f[i]-1) mx=i+f[i]-1,id=i; 8 ans=max(ans,f[i]-(s[i]!='#')); 9 }
exgcd:
1 int exgcd(int a,int b,int &x,int &y){ 2 if(!b){ x=1,y=0; return a;} 3 int d=exgcd(b,a%b,x,y); 4 int c=x; x=y,y=c-a/b*y; 5 return d; 6 } 7 8 int d=exgcd(a,b,x,y); 9 x=x*c/d,d=b/d; 10 x=(x%d+d)%d;
更成熟的fft求多项式乘(其实没啥区别:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 int rd(){int z=0,mk=1; char ch=getchar(); 8 while(ch<'0'||ch>'9'){if(ch=='-')mk=-1; ch=getchar();} 9 while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0'; ch=getchar();} 10 return z*mk; 11 } 12 void wt(int x,char y){ 13 if(!x){ putchar('0'); return ;} 14 if(x<0) putchar('-'),x=-x; 15 int wtp=0,wtc[32]; 16 while(x) wtc[++wtp]=x%10+'0',x/=10; 17 while(wtp) putchar(wtc[wtp--]); 18 putchar(y); 19 } 20 struct cp{ 21 double r,i; 22 cp(double _r=0,double _i=0): r(_r),i(_i){} 23 cp operator+(cp x){return cp(r+x.r,i+x.i);} 24 cp operator-(cp x){return cp(r-x.r,i-x.i);} 25 cp operator*(cp x){return cp(r*x.r-i*x.i,r*x.i+i*x.r);} 26 }; 27 int n,m; 28 cp a[410000],b[410000],tmp[410000],_x,_y,c[410000]; 29 int rvs[410000],dg[32],N,L; 30 void fft(cp x[],int mk){ 31 for(int i=0;i<N;++i) tmp[i]=x[rvs[i]]; 32 for(int i=0;i<N;++i) x[i]=tmp[i]; 33 for(int i=2;i<=N;i<<=1){ 34 cp wn(cos(2*M_PI/i),mk*sin(2*M_PI/i)); 35 for(int k=0;k<N;k+=i){ 36 cp w(1,0); 37 for(int j=k;j<k+(i>>1);++j){ 38 _x=x[j],_y=x[j+(i>>1)]*w; 39 x[j]=_x+_y,x[j+(i>>1)]=_x-_y; 40 w=w*wn; 41 } 42 } 43 } 44 if(mk==-1) for(int i=0;i<N;++i) x[i].r/=N; 45 } 46 int main(){freopen("ddd.in","r",stdin); 47 cin>>n>>m; 48 for(int i=0;i<=n;++i) a[i]=cp(rd()); 49 for(int i=0;i<=m;++i) b[i]=cp(rd()); 50 for(N=1,L=0;N<=max(n+1,m+1);N<<=1,++L); N<<=1,++L; 51 for(int i=0;i<N;++i){ 52 for(int j=i,k=0;j;j>>=1,++k) dg[k]=j&1; 53 for(int j=0;j<L;++j) rvs[i]=(rvs[i]<<1)|dg[j]; 54 } 55 fft(a,1),fft(b,1); 56 for(int i=0;i<N;++i) c[i]=a[i]*b[i]; 57 fft(c,-1); 58 for(int i=0;i<=n+m;++i) printf("%d ",(int)(c[i].r+0.5)); 59 cout<<endl; 60 return 0; 61 }
ntt求多项式乘:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 #define ll long long 8 const ll mo=998244353; 9 ll rd(){ll z=0,mk=1; char ch=getchar(); 10 while(ch<'0'||ch>'9'){if(ch=='-')mk=-1; ch=getchar();} 11 while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0'; ch=getchar();} 12 return z*mk; 13 } 14 ll qcp(ll x,int y){ 15 ll bs=x,z=1; 16 for(;y;y>>=1){ 17 if(y&1) z=(z*bs)%mo; 18 bs=(bs*bs)%mo; 19 } 20 return z; 21 } 22 int n,m; 23 ll a[410000],b[410000],tmp[410000],_x,_y,c[410000]; 24 int rvs[410000],dg[32],N,L; ll _1_N; 25 void ntt(ll x[],int mk){ 26 for(int i=0;i<N;++i)if(i<rvs[i]) swap(x[i],x[rvs[i]]); 27 for(int i=2;i<=N;i<<=1){ 28 ll wn=qcp(3,(mk*((mo-1)/i))%(mo-1)); 29 for(int k=0;k<N;k+=i){ 30 ll w=1; 31 for(int j=k;j<k+(i>>1);++j){ 32 _x=x[j],_y=(x[j+(i>>1)]*w)%mo; 33 x[j]=(_x+_y)%mo,x[j+(i>>1)]=(_x-_y+mo)%mo; 34 w=(w*wn)%mo; 35 } 36 } 37 } 38 if(mk==mo-2) for(int i=0;i<N;++i) x[i]=(x[i]*_1_N)%mo; 39 } 40 int main(){//freopen("ddd.in","r",stdin); 41 cin>>n>>m; 42 for(int i=0;i<n;++i) a[i]=rd(); 43 for(int i=0;i<m;++i) b[i]=rd(); 44 for(N=1,L=0;N<=max(n,m);N<<=1,++L); N<<=1,++L; 45 _1_N=qcp(N,mo-2); 46 for(int i=0;i<N;++i){ 47 for(int j=i,k=0;j;j>>=1,++k) dg[k]=j&1; 48 for(int j=0;j<L;++j) rvs[i]=(rvs[i]<<1)|dg[j]; 49 } 50 ntt(a,1),ntt(b,1); 51 for(int i=0;i<N;++i) c[i]=a[i]*b[i]; 52 ntt(c,mo-2); 53 for(int i=0;i<=n+m-2;++i) printf("%lld ",c[i]); 54 cout<<endl; 55 return 0; 56 }
中国剩余定理:
1 ll M=m[1],A=a[1],k,y; 2 for(int i=2;i<=n;++i){ 3 ll tmp=a[i]-A,d; 4 d=exgcd(M,m[i],k,y); 5 if(tmp%d) return -1; 6 ll tm=m[i]/d; 7 k=(k*tmp/d%tm+tm)%tm,A+=k*M,M=M*m[i]/d,A=(A+M)%M; 8 } 9 return A;