链接: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 的约数。小埃想知道∑i*F(i) ,(i=0~n)对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取模后的结果

示例1
输入
2
5 4
5 3
2 5
4 2
1 3
10 4 3 10 5
3 3
1 3
2 1
1 10 1
输出
11
2
备注:
n>=10000的有20组测试数据
思路:对[1,10000]每个数字的合约数作预处理,然后用dfs序求解

#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const int maxn = 2e4+10;
vector<int>g[maxn];
vector<int>vt[maxn];
bool vis[maxn];
int w[maxn];
int n,p;ll cnt[maxn];
ll ans;
void init()//预处理[1,10000]每个数的合约数
{//vis[]=1质数,vis[]=0合数 for(int i=1;i<=10000;i++) vis[i]=1;for(int i=2;i<=10000;i++){if(!vis[i]) continue;for(int j=i+i;j<=10000;j+=i)vis[j]=0;}for(int i=2;i<=10000;i++)if(!vis[i]){for(int j=i;j<=10000;j+=i)vt[j].push_back(i);}
}
//i*f[i]相当于f[i]个i累加,即对于结点u来说,它的子节点中每个合约数结点都加上一个u
//整个树中,一个结点i的cnt[i]等于结点x,y,z……的和(i是x,y,z的合约数)
void dfs(int u,int fa)
{//将这个点的合约数全部加上这个点,这个点的合约数可能存在于子结点也可能是兄弟结点 for(int i=0;i<vt[w[u]].size();i++){int v=vt[w[u]][i];cnt[v]=(cnt[v]+u)%mod;}//搜到这个点时,这个点已经加过所有满足条件的父结点 ans=(ans+cnt[w[u]])%mod;for(int i=0;i<g[u].size();i++){if(g[u][i]!=fa)dfs(g[u][i],u);}//防止搜索兄弟结点时加上这个点 for(int i=0;i<vt[w[u]].size();i++){int v=vt[w[u]][i];cnt[v]=(cnt[v]-u)%mod;}
}
int main()
{int T; scanf("%d",&T); init();while(T--){ans=0;int n,p;scanf("%d%d",&n,&p);for(int i=1;i<=n;i++) g[i].clear();for(int i=1;i<=n;i++) cnt[i]=0;for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}for(int i=1;i<=n;i++) scanf("%d",&w[i]);dfs(p,-1);printf("%lld\n",ans);}return 0;
}

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛B合约数相关推荐

  1. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 B 合约数 (dfs+预处理)(dsu on tree)

    链接:https://ac.nowcoder.com/acm/contest/9115/B 题意:给定一棵n个节点的树,并且根节点的编号为p,第i个节点有属性值vali, 定义F(i): 在以i为根的 ...

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

    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 L-K序列 链接:https://www.nowcoder.com/acm/contest/91/L 来源:牛客网 题目描述 给一个数组 ...

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

    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A-Wasserstein Distance 链接:https://www.nowcoder.com/acm/contest/91/A ...

  4. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 E-小Y吃苹果

    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 E-小Y吃苹果 链接:https://www.nowcoder.com/acm/contest/91/E 来源:牛客网 题目描述 小Y买 ...

  5. 好久没撸c,第一场回状态的题(埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛

    题目链接: 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A:Wasserstein Distance ## 题意:有2大堆柱状图的土(总体积相同,问从第一堆土移动到第二堆消耗最少的 ...

  6. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 I 二数(模拟)

    题目描述  我们把十进制下每一位都是偶数的数字叫做"二数". 小埃表示自己很聪明,最近他不仅能够从小数到大:2,3,4,5....,也学会了从大数到小:100,99,98...,他 ...

  7. 【牛客网】埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 题解

    题目连接 A.Wasserstein Distance (水题) 题意:给你2行土a,b,每行都有n堆,每堆对应有a[i],b[i]克,我们可以对a中的土进行移动,移动任意堆的k克泥土到a中其他堆消耗 ...

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

    题目描述 我们把十进制下每一位都是偶数的数字叫做"二数". 小埃表示自己很聪明,最近他不仅能够从小数到大:2,3,4,5....,也学会了从大数到小:100,99,98...,他想 ...

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

    链接:https://www.nowcoder.com/acm/contest/91/C 来源:牛客网 没有账号的同学这样注册,支持博主 题目描述 给定两个长度为n的序列,ai, bi(1<=i ...

最新文章

  1. vuex——做简单的购物车功能
  2. 偷懒日志 - 自动生成代码 - 第二步 生成POJO
  3. SQL CREATE TABLE 语句(转)
  4. setsockopt()使用方法(參数具体说明)
  5. 请求模式解决共享资源冲突
  6. 条款9:不要在构造和析构过程中调用virtual函数
  7. 窥探SnowflakeIdWorker之并发生成唯一ID
  8. 嵌入式tomcat例子
  9. 一个前端开发人员多年苦心搜集的Chrome开发者工具使用技巧
  10. win32下Socket编程(1)
  11. java timezone_Java TimeZone useDaylightTime()方法与示例
  12. ajax 动态加载的内容,相应的js也要在回调里加载
  13. 将二叉树转换成双向链表
  14. 如何巧妙的运用好弹簧布局SpringLayout?
  15. 微观、宏观、精准 多视角估算数据库性能(选型、做预算不求人)
  16. Django 点击刷新验证码
  17. 安装ghost win7后未能启动服务器,ghost win7系统安装全教程 ghost win7启动失败怎么办...
  18. 2021年前端部署的灵魂拷问
  19. 加菲猫语录精选74 中英俄三语版
  20. 五种有效的学习方法 – 方法比努力重要

热门文章

  1. iOS程序员如何面试
  2. 如何远程控制其它电脑!
  3. 统计全年12个月数据
  4. php trie,数据结构-PHP 字典树(Trie)的实现
  5. 项目三:爬取视频磁力链接
  6. android atlas,Atlas接入及使用教程
  7. mybatisplus--使用说明书
  8. SAP SD 定价过程
  9. pt100阻值温度c语言,pt100温度传感器阻值,pt100温度与阻值对照表
  10. C#练习题答案: scytale的编码器/解码器(古斯巴达密码)【难度:3级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战