埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 B-合约数(dfs序)

原创 2018年04月16日 11:57:42
链接:https://www.nowcoder.com/acm/contest/91/B
来源:牛客网

题目描述

在埃森哲,员工培训是最看重的内容,最近一年,我们投入了 9.41 亿美元用于员工培训和职业发展。截至 2018 财年末,我们会在全球范围内设立 100 所互联课堂,将互动科技与创新内容有机结合起来。按岗培训,按需定制,随时随地,本土化,区域化,虚拟化的培训会让你快速取得成长。小埃希望能通过培训学习更多ACM 相关的知识,他在培训中碰到了这样一个问题,

给定一棵n个节点的树,并且根节点的编号为p,第i个节点有属性值vali, 定义F(i): 在以i为根的子树中,属性值是vali的合约数的节点个数。y 是 x 的合约数是指 y 是合数且 y 是 x 的约数。小埃想知道对1000000007取模后的结果.

输入描述:

输入测试组数T,每组数据,输入n+1行整数,第一行为n和p,1<=n<=20000, 1<=p<=n, 接下来n-1行,每行两个整数u和v,表示u和v之间有一条边。第n+1行输入n个整数val1, val2,…, valn,其中1<=vali<=10000,1<=i<=n.

输出描述:

对于每组数据,输出一行,包含1个整数, 表示对1000000007取模后的结果

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1000000007;
vector<int>p[10004];
bool is[10004],vis[20004];
int tol,n,rt,k[20004],cnt[20004],val[20004],head[20004];
struct node
{
    int to,next;
}rode[40004];
void add(int a,int b)
{
    rode[tol].to=b;
    rode[tol].next=head[a];
    head[a]=tol++;
}
void init()
{
    memset(is,1,sizeof(is));
    for(int i=2;i<=10000;i++)
    {
        if(is[i])
        {
            for(int j=i+i;j<=10000;j+=i)
                is[j]=0;
        }
    }
    for(int i=4;i<=10000;i++)
    {
        if(!is[i])
        {
            for(int j=i;j<=10000;j+=i)p[j].push_back(i);//p[j]中保存j的合约数
        }
    }
}
void dfs(int v,int pre)
{
    vis[v]=1;
    for(int i=0;i<p[val[v]].size();i++)
    {
        int x=p[val[v]][i];
        k[v]-=cnt[x];//不在v的子树中的先减去//cnt[x]表示当前每个val出现的次数
    }
    cnt[val[v]]++;
    for(int i=head[v];i!=-1;i=rode[i].next)
    {
        node e=rode[i];
        if(e.to!=pre&&!vis[e.to])dfs(e.to,v);
    }
    for(int i=0;i<p[val[v]].size();i++)
    {
        int x=p[val[v]][i];
        k[v]+=cnt[x];//前面减这里加,抵消掉正好是v的子树中每个x出现的次数
    }
}
int main()
{
    init();
    int T;scanf("%d",&T);
    while(T--)
    {
        memset(head,-1,sizeof(head));
        memset(vis,0,sizeof(vis));tol=1;
        memset(k,0,sizeof(k));
        memset(cnt,0,sizeof(cnt));
        scanf("%d%d",&n,&rt);
        for(int i=1;i<n;i++)
        {
            int x,y;scanf("%d%d",&x,&y);
            add(x,y);add(y,x);
        }
        for(int i=1;i<=n;i++)scanf("%d",&val[i]);
        dfs(rt,0);//根节点开始遍历
        ll ans=0;
        for(ll i=1;i<=n;i++)
            ans=(ans+i*k[i])%mod;
        printf("%lld\n",ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/albertluf/article/details/79958805

【牛客网】【埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛】B—合约数【莫队做法】

题目链接:B—合约数题意:一棵树,有n个节点,从1编号到n。根节点的编号为p。给出每个节点的val[i]值,定义f(i)为以编号i为根节点的子树中(包括根节点),所有val[j]是合数并且是val[i...
  • gymgym1212
  • gymgym1212
  • 2018-04-15 20:33:28
  • 137

【牛客网】【埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛】L—K序列【动态规划】

题目链接:L—K序列题解:for一遍数组,temp[i]表示:不包括当前for到的点,序列和为i的最长长度。然后for一遍0-k,对dp[ (j+num[i])%k ]进行更新,dp[j]是包括当前点...
  • gymgym1212
  • gymgym1212
  • 2018-04-15 18:46:39
  • 173

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛

B - 合约数 思路: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;n...
  • hnust_Derker
  • hnust_Derker
  • 2018-04-15 19:06:59
  • 124

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛F题 1+2=3?

题目链接:https://www.nowcoder.com/acm/contest/91/F题意:求第N个符合条件X^2X=3X的X。N&amp;lt;=10的12次方。解题思路:我刚开始想到最粗暴的...
  • weixin_36416680
  • weixin_36416680
  • 2018-04-16 11:01:00
  • 61

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 J-小Y写文章(二分+二分图匹配)

链接:https://www.nowcoder.com/acm/contest/91/J来源:牛客网题目描述 小Y写了一篇文章,他对自己的文笔很有自信,尤其是自己总结出了一套计算文章通顺性的公式。 ...
  • albertluf
  • albertluf
  • 2018-04-18 10:27:07
  • 83

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛-O题

题目链接:点击打开链接 解题思路:题目告诉我们当然主人公够聪明,但是不知道传送门是怎么对应的,那么此时可以看做只有两个操作。一:不进入传送门直接走。二:进入离出发点最近的传送门(毕竟不知道肯定是选...
  • a1214034447
  • a1214034447
  • 2017-07-10 10:23:23
  • 403

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛(部分题解)

窝本来是参加的现场赛的,现场赛相对于网赛,多了两题,有些题也不一样,可能签到题也多了两道…… Wasserstein Distance 这题蛮坑喔….现场时因为wa一发就没再去看,去啃异或了,...
  • Eternally831143
  • Eternally831143
  • 2018-04-16 22:56:41
  • 26

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛A题Wasserstein Distance

题目链接:https://www.nowcoder.com/acm/contest/91/A题意:给两组数据,求把A变成B状态需花费的最小体力。思路:s=s+abs(a[i]-b[i]);a[i+1]...
  • weixin_36416680
  • weixin_36416680
  • 2018-04-15 20:11:56
  • 36

K序列--埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛

链接:https://www.nowcoder.com/acm/contest/91/L来源:牛客网K序列时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言2621...
  • zitian246
  • zitian246
  • 2018-04-16 16:47:40
  • 45

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F-1+2=3?

链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网题目描述 小Y在研究数字的时候,发现了一个神奇的等式方程,他屈指算了一下有很多正整数x满足这个等式...
  • albertluf
  • albertluf
  • 2018-04-15 16:46:44
  • 135
收藏助手
不良信息举报
您举报文章:埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 B-合约数(dfs序)
举报原因:
原因补充:

(最多只允许输入30个字)