【金马五校赛】B 合约数(预处理+dfs序)

原创 2018年04月17日 18:43:02

链接:https://www.nowcoder.com/acm/contest/91/B
来源:牛客网

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
在埃森哲,员工培训是最看重的内容,最近一年,我们投入了 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取模后的结果

示例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组测试数据

链接:https://www.nowcoder.com/acm/contest/91/B
来源:牛客网

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
在埃森哲,员工培训是最看重的内容,最近一年,我们投入了 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取模后的结果

示例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组测试数据

题解:
这里写图片描述

代码:

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for(int i=a;i<n;i++)
#define mem(a,n) memset(a,n,sizeof(a))
#define pb push_back
#define IO ios::sync_with_stdio(false);
typedef long long ll;
const int N=2e4+5;
const double eps=1e-4;
const int MOD=1e9+7;
const int dir[4][2]= {-1,0,1,0,0,-1,0,1}; ///上下左右
const int INF=0x3f3f3f3f;

vector<int>fac[N];
vector<int>g[N];
bool isprime[N];
int val[N],cnt[N];
int F[N];
///预处理 [1,N]中每个数的合约数个数  O(N*sqrt(N))
void init() 
{
    rep(i,2,N) isprime[i]=1;
    for(int i=2; i*i<=N; i++)
    {
        if(isprime[i])
        {
            for(int j=i*i; j<=N; j+=i)
                isprime[j]=0;
        }
    }
    for(int i=4; i<=10000; i++)
    {
        if(!isprime[i])
        {
            for(int j=i; j<=N; j+=i)
                fac[j].push_back(i);
        }
    }
}
int ans;
void dfs(int u,int fa)
{
    for(auto num:fac[val[u]])
    {
        F[u]-=cnt[num];///先减去之前出现过的合约数的个数
    }
    cnt[val[u]]++;
    for(auto v:g[u])
    {
        if(v==fa) continue;
        dfs(v,u);///递归树
    }
    ///回溯
    for(auto num:fac[val[u]])
    {
        F[u]+=cnt[num];///现在出现过的总数 = 遍历完其子树后的总合约数个数-之前出现的合约数个数.  
    }
    ans=(ans+1LL*u*F[u])%MOD;
}
int main()
{
    init();
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,p;
        scanf("%d%d",&n,&p);
        mem(cnt,0);
        for(int i=0; i<=n; i++)
        {
            F[i]=0;
            g[i].clear();
        }
        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",&val[i]);
        }
        ans=0;
        dfs(p,-1);
        printf("%d\n",ans);
    }
    return 0;
}
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/feng_zhiyu/article/details/79978979

在32位程序中如何实现进程间通讯

1、引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同...
  • saliven
  • saliven
  • 2001-03-09 13:12:00
  • 980

合约数

题目描述 给定一棵n个节点的树,并且根节点的编号为p,第i个节点有属性值vali, 定义F(i): 在以i为根的子树中,属性值是vali的合约数的节点个数。y 是 x 的合约数是指 y 是合数且...
  • luyehao1
  • luyehao1
  • 2018-04-17 15:19:28
  • 22

【区块链学习】以Windows为例,通过以太坊钱包部署和运行智能合约

安装环境(以我个人的配置环境说明)安装Ethereum-Wallet(1)国内镜像下载地址 (2)在F盘新建文件夹Eth,专门放置以太坊开发环境 (3)把下载的Ethereum-Wallet-wi...
  • Slow_Wakler
  • Slow_Wakler
  • 2017-06-07 01:49:34
  • 5933

【区块链学习】以Linux为例,通过控制台部署和运行智能合约

安装环境安装以太坊环境(1) sudo apt-get install software-properties-common(2)sudo add-apt-repository -y ppa:ethe...
  • Slow_Wakler
  • Slow_Wakler
  • 2017-06-07 13:29:59
  • 1038

第二个智能合约

第二个智能合约 第一个被helloworld占掉了,所以这个是第二个, 通过智能合约实现几个简单的函数,作为对solidity的初步学习 什么是智能合约 solidity官方doc G...
  • zz709196484
  • zz709196484
  • 2018-01-25 19:20:52
  • 159

LSTM+Tensorflow(文本自动生成)资源

Tensorflow之MNIST解析 https://www.cnblogs.com/lizheng114/p/7439556.html 用LSTM自动生成古诗 https://blog.csd...
  • feng_zhiyu
  • feng_zhiyu
  • 2018-04-19 17:05:54
  • 8

第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 B 合约数(启发式合并)

链接:https://www.nowcoder.com/acm/contest/91/B来源:牛客网题目描述 在埃森哲,员工培训是最看重的内容,最近一年,我们投入了 9.41 亿美元用于员工培训和职...
  • lzc504603913
  • lzc504603913
  • 2018-04-15 19:17:02
  • 58

【区块链】以太坊私有链下智能合约部署

以太坊私有链下智能合约部署上一篇文章实现了搭建私有链,以下进行智能合约的部署一、 编写合约简单的乘法例子:pragma solidity ^0.4.2; contract test { funct...
  • loy_184548
  • loy_184548
  • 2017-09-16 10:59:15
  • 1719

从 Demo 中学习 Solidity

从 Demo 中学习 Solidity [注解译文] 前 (全文参考) Solidity官方文档 以太坊白皮书_ZH 以太坊白皮书_EN 发现网上的资料太过琐碎, 惊奇的发现官...
  • zz709196484
  • zz709196484
  • 2018-01-27 00:08:33
  • 393

【区块链】记录合约开发中遇到的坑

记录合约开发中遇到的坑 一、 交易没有被广播 问题:合约在在线编译器remix上能够正常读写数据,在本地私有链上却失败数据写不进去,也没有任何错误提示。 例如: &amp;gt; bi...
  • loy_184548
  • loy_184548
  • 2018-03-29 17:19:57
  • 68
收藏助手
不良信息举报
您举报文章:【金马五校赛】B 合约数(预处理+dfs序)
举报原因:
原因补充:

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