zoukankan      html  css  js  c++  java
  • hdu 5468(莫比乌斯+搜索)

    hdu 5468 Puzzled Elena   /*快速通道*/

    Sample Input

    5 1 2 1 3 2 4 2 5 6 2 3 4 5
     

    Sample Output

    Case #1: 1 1 0 0 0

    题意:在一棵树上,每个节点有值,求以x为根节点的树中,有多少与根节点互质

    思路:

    用num[i]记录节点中包含因子i的个数,然后搜索到当前根节点时,我们先记录下在此之前的num,然后遍历返回后,

    计算num的差值,利用莫比乌斯原理,先ans记录树中所有的节点数,然后该加的加,该减的减。

    莫比乌斯不清楚的话可以翻翻前面的文章。


    参考以下大大博文:

    AOQNRMGYXLMV

    Tc_To_Top

    /*
    如果互质,找出子树中包含val[cur]的因子的数,假设为6,则减去约数中含有2,3的
    但是会重复减去含有6的,所以应该在加上含6的数
    于是满足了莫比乌斯函数,合数为0,含奇数个质数为-1,含偶数个质数为1
    感觉特别适合容斥原理。
    
    
    对于dfs序:/*并不了解,也可以做的
    将树展现在数组上。
    void DFS(int u, int fa)  
    {  
        dfn ++;  
        seq[dfn] = u;  
        for(int i = HEAD[u]; i != -1; i = E[i].next)  
        {  
            int v = E[i].to;  
            if(v != fa)  
                DFS(v, u);  
        }  
        dfn ++;  
        seq[dfn] = -u;  
    }
    
    参考:
    AOQNRMGYXLMV:http://www.cnblogs.com/AOQNRMGYXLMV/p/4858452.html
    Tc_To_Top:http://blog.csdn.net/tc_to_top/article/details/48802683
    */
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #include <functional>
    typedef long long ll;
    using namespace std;
    
    const int inf = 0x3f3f3f3f;
    const int maxn = 100000;
    
    
    int is_prime[maxn+10];
    int prime[maxn+10];
    int mu[maxn+10];
    int snum[maxn+10];
    vector<int> fac[maxn + 10];
    vector<int> F[maxn+10];
    int tot;
    void Moblus()
    {
        tot = 0;
        memset(is_prime,0,sizeof(is_prime));
        mu[1] = 1;
        for(int i = 2; i <= maxn; i++)
        {
            if(!is_prime[i])
            {
                prime[tot++] = i;
                mu[i] = -1;
            }
    
            for(int j = 0; j < tot; j++)
            {
                if(prime[j]*i>maxn)
                    break;
                is_prime[i*prime[j]] = 1;
                if(i % prime[j])
                {
                    mu[i*prime[j]] = -mu[i];
                }
                else
                {
                    mu[i*prime[j]] = 0;
                    break;
                }
            }
        }
        for(int i = 2; i <= maxn; i++)
        {
            if(mu[i])
                for(int j = i; j <= maxn; j+=i)
                    fac[j].push_back(i);
        }
    }
    
    int val[maxn],num[maxn],ans[maxn];
    
    
    void dfs(int cur,int par)
    {
        snum[cur] = 1;
        vector<int>tt;
        for(int i = 0; i<fac[val[cur]].size(); i++)
        {
            int v = fac[val[cur]][i];
            tt.push_back(num[v]);
            num[v]++;
    
        }
        for(int i = 0; i < F[cur].size(); i++)
        {
            int v = F[cur][i];
            if(v == par)
                continue;
            dfs(v,cur);
            snum[cur] += snum[v];
        }
        ans[cur] = snum[cur];
        for(int i = 0; i<fac[val[cur]].size(); i++)
        {
            int v = fac[val[cur]][i];
            int c = num[v]-tt[i];
            if(c)
                ans[cur] += mu[v]*c;
    
        }
    }
    
    void ini()
    {
        tot=  0;
        memset(ans,0,sizeof(ans));
        memset(num,0,sizeof(num));
        //memset(head,-1,sizeof(head));
    }
    
    int main()
    {
        int n;
        Moblus();
        int cas = 1,a,b;
        while(scanf("%d",&n) != EOF)
        {
            ini();
            for(int i = 0;i <= n;i++)
            F[i].clear();
            for(int i = 0; i <n-1; i++)
            {
                scanf("%d%d",&a,&b);
                F[a].push_back(b);
                F[b].push_back(a);
            }
            for(int i = 1 ; i <= n; i++)
                scanf("%d",&val[i]);
            dfs(1,0);
            printf("Case #%d:",cas++);
    
            for(int i = 1; i <= n; i++)
            {
                printf(" %d",ans[i]);
            }
            printf("
    ");
        }
        return 0;
    }
    

      


    
    
  • 相关阅读:
    Redis(二) 扩展
    Redis(一)基础
    Java垃圾回收机制 入门
    freeregex-0.01 使用文档
    上传文件到阿里云linux服务器
    jQuery代码解释(基本语法)
    JQuery中使用FormData异步提交数据和提交文件
    jQuery获取data-*属性值
    jquery 中 $.map 的使用方法
    mysql创建表时反引号的作用
  • 原文地址:https://www.cnblogs.com/Przz/p/5409692.html
Copyright © 2011-2022 走看看