zoukankan      html  css  js  c++  java
  • cf 990G

    题意

    #include<bits/stdc++.h>
    #define t 200000
    #define MAXN 200100
    using namespace std;
    
    int n;
    int fa[MAXN],fa1[MAXN];
    long long ans[MAXN],size[MAXN];
    vector <int> e[MAXN],Edge[MAXN];
    
    int find(int x){
        if (x==fa1[x])
            return fa1[x];
        else 
            return fa1[x]=find(fa1[x]);
    }
    
    void dfs(int x,int y){
        int x1,x2;
        x1=Edge[x].size();
        for (int i=0;i<x1;i++){
            x2=Edge[x][i];
            if(x2==y)
                continue;
            fa[x2]=x;
            dfs(x2,x);
        }
    }
    
    int main(){
        scanf("%d",&n);
        int x,y;
        for (int i=1;i<=n;i++){
            scanf("%d",&x);
            e[x].push_back(i);
        }
        for (int i=1;i<=n-1;i++){
            scanf("%d %d",&x,&y);
            Edge[x].push_back(y);
            Edge[y].push_back(x);
        }
        dfs(1,-1);
        for (int i=1;i<=t;i++){
            for (int j=i;j<=t;j+=i){
                ans[i]+=e[j].size();
                x=e[j].size();
                for (int k=0;k<x;k++){
                    int y=e[j][k];
                    fa1[y]=y;
                    size[y]=1;
                }
            }
    
            for (int j=i;j<=t;j+=i){
                x=e[j].size();
                for (int k=0;k<x;k++){
                    int y=e[j][k];
                    if (y==1)
                        continue;
                    if (fa1[fa[y]]==0)
                        continue;
                    int x1=find(y);
                    int y1=find(fa[y]);
                    ans[i]=ans[i]+size[x1]*size[y1];
                    fa1[x1]=y1;
                    size[y1]+=size[x1];
                }
            }
    
            for (int j=i;j<=t;j+=i){
                x=e[j].size();
                for (int k=0;k<x;k++){
                    int y=e[j][k];
                    fa1[y]=0;
                    size[y]=0;
                }
            }
        }
    
        for (int i=t;i>=1;i--)
            for (int j=i*2;j<=t;j+=i)
                ans[i]-=ans[j];
        
        for (int i=1;i<=t;i++)
            if (ans[i])
                printf("%d %lld
    ",i,ans[i]);
        return 0;
    }
    

      

  • 相关阅读:
    2021-5-14 日报博客
    2021-5-13 日报博客
    2021-5-11 日报博客
    2021-5-10 日报博客
    2021-5-8 周报博客
    团队介绍——北部大队
    周总结4
    梦断代码阅读笔记02
    周总结3
    周总结2
  • 原文地址:https://www.cnblogs.com/wjnclln/p/10325670.html
Copyright © 2011-2022 走看看