c++复习板子
数论
GCD
点击查看
-
B4025 最大公约数
gcd:
点击查看代码
#include<bits/stdc++.h> #define int long long using namespace std; int a,b; inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; else ch=getchar(); } while(ch>='0'&&ch<='9'){ x=(x*10+ch-48); ch=getchar(); } return x*f; } int gcd(int a,int b) { if(!b) return a; return gcd(b,a%b); } signed main(){ a=read(),b=read(); cout<<gcd(a,b); }
-
P2613 【模板】有理数取余
exgcd:
点击查看代码
#include<bits/stdc++.h> #define int long long using namespace std; const int mod=19260817; int a,b; int pow(int a,int b){ int res=1; while(b){ if(b&1){ res=res*a%mod; } a=a*a%mod; b>>=1; } return res; } inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; else ch=getchar(); } while(ch>='0'&&ch<='9'){ x=(x*10+ch-48)%mod; ch=getchar(); } return x*f%mod; } signed main(){ a=read(),b=read(); if(!b){ cout<<"Angry!"; return 0; } cout<<a*pow(b,mod-2)%mod; }
筛法
点击查看
-
P3383 【模板】线性筛素数
欧拉筛:
点击查看代码
#include<bits/stdc++.h> #define int long long using namespace std; int n,q,tot; int prime[7000003]; //判断质数 bool vis[100000004]; void Prime_shai(int up){ memset(vis,1,sizeof vis); vis[1]=0; for(int i=2;i<=n;i++){ if(vis[i]){ prime[++tot]=i; //没有被筛就是质数 } for(int j=1;prime[j]*i<=n&&j<=tot;j++){ vis[i*prime[j]]=0; //被筛到打个标记 if(!i%prime[j]) break; //如果prime[j]是i的因子,那么以后得最小质因数就不在是prime[x]而是prime[j] } } } int a; signed main(){ cin>>n>>q; Prime_shai(n); while(q--){ cin>>a; cout<<prime[a]<<"\n"; } }
图论
最短路
点击查看
-
P3371 【模板】单源最短路径(弱化版)
SPFA :
点击查看代码
#include<bits/stdc++.h> #define int long long using namespace std; int n,m,u,v,w,s; struct node{ int to,nxt,w; }z[10000040]; //链式前向星 int cnt; int h[1000004]; int dis[1000004]; int vis[1000004]; void add(int x,int y,int w){ z[++cnt].to=y; z[cnt].nxt=h[x]; z[cnt].w=w; h[x]=cnt; } void SPFA(int start){ for(int i=1;i<=n;i++) dis[i]=1e11,vis[i]=0; vis[start]=1; queue<int> p; dis[start]=0; p.push(start); while(!p.empty()){ int x=p.front(); p.pop(); vis[x]=0; for(int i=h[x];i;i=z[i].nxt){ int y=z[i].to; if(dis[y]>dis[x]+z[i].w){ dis[y]=z[i].w+dis[x]; if(!vis[y]){ vis[y]=1; p.push(y); } } } } } signed main(){ cin>>n>>m>>s; for(int i=1;i<=m;i++){ scanf("%lld%lld%lld",&u,&v,&w); add(u,v,w); } SPFA(s); for(int i=1;i<=n;i++){ if(dis[i]!=1e11) cout<<dis[i]<<" "; else cout<<"2147483647 "; } }
-
P4779 【模板】单源最短路径(标准版)
迪杰斯特拉:
点击查看代码
#include<bits/stdc++.h> #define int long long using namespace std; typedef pair<int,int> pii; int n,m,u,v,w,s; struct node{ int to,nxt,w; }z[10000040]; //链式前向星 int cnt; int h[1000004]; int dis[1000004]; int vis[1000004]; void add(int x,int y,int w){ z[++cnt].to=y; z[cnt].nxt=h[x]; z[cnt].w=w; h[x]=cnt; } void dijie(int start){ for(int i=1;i<=n;i++) dis[i]=1e11,vis[i]=0; dis[start]=1; priority_queue<pii,vector<pii>,greater<pii> > p; p.push(make_pair(0,start)); while(!p.empty()){ int x=p.top().second; p.pop(); if(vis[x]) continue; else{ vis[x]=1; for(int i=h[x];i;i=z[i].nxt){ int y=z[i].to; if(dis[y]>dis[x]+z[i].w){ dis[y]=dis[x]+z[i].w; p.push(make_pair(dis[y],y)); } } } } } signed main(){ cin>>n>>m>>s; for(int i=1;i<=m;i++){ scanf("%lld%lld%lld",&u,&v,&w); add(u,v,w); } dijie(s); for(int i=1;i<=n;i++){ cout<<dis[i]<<" "; } }
-
B3647 【模板】Floyd
Floyd:
点击查看代码
#include<bits/stdc++.h> using namespace std; int main(){ int n,m; cin>>n>>m; int a[102][102]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ a[i][j]=0x3f3f3f3f; a[j][i]=0x3f3f3f3f; } } for(int i=1;i<=m;i++){ int a1,b,c; cin>>a1>>b>>c; if(a[a1][b]>c){ a[a1][b]=c; a[b][a1]=c; } } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][k]+a[k][j]<a[i][j]){ a[i][j]=a[i][k]+a[k][j]; a[j][i]=a[i][k]+a[k][j]; } if(i==j){ a[i][j]=a[j][i]=0; } } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<a[i][j]<<" "; } cout<<endl; } }
-
P1144 最短路计数
点击查看代码
#include<bits/stdc++.h> #define int long long using namespace std; const int Mod=100003; typedef pair<int,int> pii; int cnt,n,m,x,y; map<int,int> mp[2000040]; int h[3000004]; struct node{ int to,nxt; }z[4000004]; void add(int x,int y){ z[++cnt].to=y; z[cnt].nxt=h[x]; h[x]=cnt; } int ans[3000003]; int dis[3000004]; int vis[3000004]; void dijie(int start){ priority_queue<pii,vector<pii>,greater<pii> > p; for(int i=1;i<=n;i++) dis[i]=1e11,vis[i]=0; dis[start]=0; ans[start]=1; p.push({0,start}); while(!p.empty()){ int x=p.top().second; p.pop(); if(vis[x]) continue; else{ vis[x]=1; for(int i=h[x];i;i=z[i].nxt){ int y=z[i].to; if(dis[y]>dis[x]+1){ dis[y]=dis[x]+1; ans[y]=ans[x]; p.push({dis[y],y}); } else if(dis[y]==dis[x]+1){ ans[y]+=ans[x]; ans[y]%=Mod; } } } } } signed main(){ cin>>n>>m; for(int i=1;i<=m;i++){ cin>>x>>y; if(x==y) continue; else{ // if(mp[x].count(y)) continue; //判重边 add(x,y); add(y,x); mp[x][y]=1; mp[y][x]=1; } } dijie(1); for(int i=1;i<=n;i++){ cout<<ans[i]<<"\n"; } }
-
P5960 【模板】差分约束
点击查看代码
#include<bits/stdc++.h> #define int long long using namespace std; int n,m; struct node{ int to,nxt,w; }z[1000004]; int cnt; int h[1000004]; void add(int x,int y,int w){ z[++cnt].to=y; z[cnt].w=w; z[cnt].nxt=h[x]; h[x]=cnt; } int dis[1000004]; int vis[1000004]; int tot[1000004]; bool SPFA(int s){ memset(dis,0x3f3f3f,sizeof(dis)); vis[s]=1; dis[s]=0; queue<int> p; p.push(s); while(!p.empty()){ int x=p.front(); p.pop(); vis[x]=0; for(int i=h[x];i;i=z[i].nxt){ int y=z[i].to; if(dis[y]>dis[x]+z[i].w){ dis[y]=dis[x]+z[i].w; if(!vis[y]){ tot[y]++; vis[y]=1; if(tot[y]==n+1) return false; p.push(y); } } } } return true; } signed main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int a,b,c; scanf("%lld%lld%lld",&a,&b,&c); add(b,a,c); } for(int i=1;i<=n;i++) add(0,i,0); if(SPFA(0)){ for(int i=1;i<=n;i++){ cout<<dis[i]<<" "; } } else{ cout<<"NO"; } }
树论
树的直径
点击查看
-
B4016 树的直径
点击查看代码
#include<bits/stdc++.h> using namespace std; int n,a,b; struct node{ int to,nxt; }z[1000004]; int cnt; int h[1000040]; void add(int x,int y){ z[++cnt].to=y; z[cnt].nxt=h[x]; h[x]=cnt; } int id,maxx; int dis[2000004]; void dfs(int x,int fa){ if(dis[x]>maxx){ maxx=dis[x]; id=x; } for(int i=h[x];i;i=z[i].nxt){ int y=z[i].to; if(y==fa) continue; else{ dis[y]=dis[x]+1; dfs(y,x); } } } int main(){ cin>>n; for(int i=1;i<n;i++){ cin>>a>>b; add(a,b); add(b,a); } dfs(1,0); memset(dis,0,sizeof dis); maxx=0; dfs(id,0); cout<<maxx; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】