TopCoder srm683 div2 1000

2024-01-28 05:58
文章标签 div2 1000 topcoder srm683

本文主要是介绍TopCoder srm683 div2 1000,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

已经弱到去div2混了……
题意:给一棵无根树,计算它的所有子树的大小的和。
这个问题转化为统计每个节点的“贡献”,即它在所有可能的子树中出现了多少次。还是先拿有根树来考虑,假设我们已经计算出了树t所有节点的“贡献”,如果在t中的某个叶子v上,连接一棵新的子树t’会怎么样呢?这样一来,v的贡献会将会被乘上“子树t’的树根的贡献+1”。于是,我们可以通过dfs,计算出以每个节点为根的子树中,该节点的“贡献”。
因为整棵树的根没有父节点,它的答案就是前面计算的值。对于其他节点,我们也同样应该把它们转化为根考虑,我们可以“砍断”它与父节点相连的边,再把父节点当成儿子加入(根据之前计算与逆元来完成),这个过程需要第二次dfs。
具体还是看代码容易理解。

#include <bits/stdc++.h>
#include <unordered_map> using namespace std;#define ll long longint a[100010];const int mod = 1e9+7;void ExEuclid(ll a,ll b,ll &x,ll &y,ll &q){      if(b==0){      x=1;y=0;q=a;      return;      }      ExEuclid(b,a%b,y,x,q);      y-=x*(a/b);      
}      ll inv(ll num){      ll x,y,q;      ExEuclid(num,mod,x,y,q);      if(q==1)return (x+mod)%mod;else return 0;  
}vector<int> adj[100010];
int p[100010];
ll ans[100010];ll dfs(int u,int pre){int sz=adj[u].size();ans[u] = 1;for(int i = 0;i<sz;i++){int v = adj[u][i];if(v==pre)continue;p[v]=u;ans[u]*=(dfs(v,u)+1);ans[u]%=mod;}return ans[u];
}ll res = 0;void dfs2(int u,int pre){int sz=adj[u].size();if(u==0){res+=ans[u];}else{ans[u] = ans[u] * (  ((ans[p[u]]*inv(ans[u]+1) )%mod+1)%mod )%mod;res+=ans[u];res%=mod;}for(int i = 0;i<sz;i++){int v = adj[u][i];if(v==pre)continue;dfs2(v,u);}
}class SubtreesCounting{
public:int sumOfSizes(int n, int a0, int b, int c, int m){a[0] = a0;for(int i=1;i<=n-2;i++){a[i] = ( (b+0LL) * a[i-1] + c) % m;}for(int i=1;i<=n-1;i++){int j = a[i-1] % i;adj[i].push_back(j);adj[j].push_back(i);}dfs(0,-1);dfs2(0,-1);return (int)res;}
};

这篇关于TopCoder srm683 div2 1000的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652670

相关文章

【oracle sql错误】ORA-01795: 列表中的最大表达式数为 1000

select SOURCE_ID,FILTER_TEXT from TEXT_CENTER where SOURCE_ID in() in后面的括号里的数目超过1000条。 问题描述: SQL进行IN查询时,IN中的数据量不能超过1000条。 解决办法: 拆分:id in (1,2,3,4,5,,,,999) or id in(1000,1001,1002,1003,1004,,,,,,

汇总1000+国内外AI工具合集,工作效率提升10倍的秘诀!

工具合集在文章末尾有领取方式。记得点在看收藏,每天默默的学习,然后惊艳所有人。 很多AI,都是开发商在自己的领域,或是借助某个领域的资源进行算法的模型训练。就目前来讲,每款AI都具备它自身的功能特性,没有任何一款AI是全能的。这也就是说,想要让AI能全能代替人类思维工作,可能还需要更多的资源的链接。 对于用AI工具来做SEO优化,我总结了一套实战思路分享给副业项目微商圈公众号的朋友们。操作

【#254_DIV2】-A B C

题目链接:http://codeforces.com/contest/445 解题报告: 俄国人今天不知道为什么九点钟就比赛了。只过了两道题,第三题完全没思路,有时间单独去刷第三题吧,看起来很难 A - DZY Loves Chessboard 太水了。。。 直接W、B错开填,顺便先抹上“ - ” 就完了 #include <iostream>#include <cstdio>

【#247_DIV2】-A B C

题目链接:http://codeforces.com/contest/431 解题报告: A - Black Square 一道神经病的题。。不知道为何水到如此地步。。。 #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int

1秒等于1000毫秒, 1毫秒等于1000微秒,1微秒等于1000纳秒

常用时间单位转换指南 在计算机科学、物理学以及其他领域中,我们经常需要处理不同量级的时间单位。了解这些单位之间的转换关系,可以帮助我们更准确地进行计算和分析。下面是一些常用的时间单位及其相互之间的转换。 时间单位概述 秒(Second, s):基本时间单位,定义为铯-133原子基态的两个超精细能级间跃迁对应辐射的9,192,631,770个周期的持续时间。毫秒(Millisecond, ms

HDU 1000 (水题)

题意:输入两个整数,求两个整数的和。   #include <cstdio>int main(){int a, b;while (scanf("%d%d", &a, &b) != EOF){printf("%d\n", a+b);}}

Codeforces 969 div2[A~E] 个人题解

目录 A - Dora's Set 原题链接 思路分析 AC代码 B - Index and Maximum Value 原题链接 思路分析 AC代码 C - Dora and C++ 原题链接 思路分析 AC代码 D - Iris and Game on the Tree 原题链接 思路分析 AC代码 E - Iris and the Tree 原题链接 思

道阻且长,行则将至——记累计跑步1000公里

2017 年开始 Keep 软件记录跑步,确切的说是工作好多年之后正式开始跑步。 在跑步累计 100 公里的时候,当时定了个小目标:1000 公里。 https://mp.weixin.qq.com/s/_QqLHwiR659obLSQs2ZJnw 没想到,这一晃过去了 7 年,就在今天 2024年8月27日,累计跑量突破 1000 公里。 对于一些马拉松爱好者、经常跑步的跑友来说,这不值一

张宇36讲+1000题重点强化!保100冲120速刷攻略

如果你选择考研时全程跟随张宇的课程,基础阶段使用《张宇30讲》,强化阶段跟着《张宇36讲》,并且还要完成《张宇1000题》,那么你的任务量将非常大。尤其是今年,张宇老师的课程体系发生了重大调整: 张宇老师将往年只在强化阶段讲授的内容,提前整合到了《张宇30讲》基础课程中。而新版的《张宇36讲》是全新编写和录制的,内容非常丰富,书籍篇幅超过1200页。 《张宇1000题》的难度众所周知,其综合性

hiho 1000: A+B

时间限制: 1000ms 单点时限: 1000ms 内存限制: 256MB 描述 求两个整数A+B的和 输入 输入包含多组数据。 每组数据包含两个整数A(1 ≤ A ≤ 100)和B(1 ≤ A ≤ 100)。 输出 对于每组数据输出A+B的和。 样例输入 1 23 4 样例输出 37 代码(C语言): #include <stdio.h>in