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;
    } 
    
posted @   yueyan_WZF  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示