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

标签: ACM CodeForces
11人阅读 评论(0) 收藏 举报
分类:

链接:第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛:B-合约数

题意:给出一个树,树的节点编号1-N,每个节点有个val,定义F(i) = 节点i的子树的节点中的val是val[i]的合约数的个数(包括节点i)。合约数:若x是y的约数,且x是合数,则称x是y的合约数。求 对1e9+7取模后的结果。

题解:DFS。直接遍历树,遍历时标记非合数节点的val的个数,然后逆求该节点对其祖先节点的贡献。注意在节点出递归栈消除标记。

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

const double EPS = 1e-8;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int maxn = 20000 + 10;
const int maxv = 10000 + 10;
int n, p;
int val[maxn];
bool isprime[maxn], vis[maxn];
vector<int> g[maxn];
long long fa[maxn], ans = 0;

void sieve()
{
    memset(isprime, false, sizeof(isprime));
    isprime[0] = isprime[1] = false;
    for(int i = 2; i < maxv; i++){
        if(!isprime[i]){
            for(int j = i << 1; j < maxv; j += i) isprime[j] = true;
        }
    }
}

void DFS(int v)
{
    vis[v] = true;
    if(isprime[val[v]]){
        fa[val[v]] = (fa[val[v]] + v) % mod;
        for(int i = 1; i * val[v] < maxv; i++) ans = (ans + fa[val[v] * i]) % mod;
    }

    for(int i = 0, n = g[v].size(); i < n; i++) if(!vis[g[v][i]]) DFS(g[v][i]);

    if(isprime[val[v]]){
        fa[val[v]] = (fa[val[v]] - v) % mod;
        if(fa[val[v]] < 0) fa[val[v]] = (fa[val[v]] + mod) % mod;
    }
}

int main()
{
    sieve();

    int T;
    scanf("%d", &T);
    while(T--){
        scanf("%d%d", &n, &p);

        for(int i = 1; i <= n; i++) g[i].clear();
        memset(fa, 0, sizeof(fa));
        memset(vis, false, sizeof(vis));

        for(int i = 1, a, b; i < n; i++){
            scanf("%d%d", &a, &b);
            g[a].push_back(b);
            g[b].push_back(a);
        }
        for(int i = 1; i <= n; i++) scanf("%d", &val[i]);

        ans = 0;
        DFS(p);

        printf("%d\n", ans);
    }

    return 0;
}

查看评论

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

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
  • 115

【牛客网】【埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛】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
  • 153

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

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

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

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

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛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
  • 48

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛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
  • 33

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

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

第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛(部分题解)

唉,好久没更新博客了,说明我这段时间在学习上都懈怠了Σ( ° △ °|||)︴昨天打了场金马赛,这网络…..我真的是无力吐槽…..前三题都是大水题,就不挂代码了;D-快速幂取模裸题#include u...
  • Murphyc
  • Murphyc
  • 2017-07-10 13:54:47
  • 481

SHU-“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛-A~K && M

ACM模版这个比赛早就知道有,但是因为自己要骑行,结果就没有注册,后来骑行计划延期,但是也忘了注册,赛后重现赛尝试做了 12 道,感觉水题比较多,剩下三个 AC 的人好少啊,感觉我这么菜肯定也是做不出...
  • f_zyj
  • f_zyj
  • 2017-07-14 00:55:01
  • 549

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

链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网题目描述 小Y在研究数字的时候,发现了一个神奇的等式方程,他屈指算了一下有很多正整数x满足这个等式...
  • albertluf
  • albertluf
  • 2018-04-15 16:46:44
  • 106
    个人资料
    持之以恒
    等级:
    访问量: 2488
    积分: 352
    排名: 22万+
    最新评论