Topcoder SRM 683 Div2 - C
树形Dp的题,根据题意建树。
DP[i][0] 表示以i为根节点的树的包含i的时候的所有状态点数的总和
Dp[i][1] 表示包含i结点的状态数目
对于一个子节点v
Dp[i][0] = (Dp[v][1]+1)*Dp[i][0]+Dp[v][0]*Dp[i][1]
表示子节点的所有状态与i的所有的状态之间的组合(可以不组合,所以DP[v][1]+1),
接下来更新i的状态数目
DP[i][1] = Dp[i][1]*(Dp[v][1]+1)
这样就可以算出来i结点为根结的所以状态,树中的所有点的状态和就是答案。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;
typedef vector<int>VI;
const int Max = 1e5+10;
const LL Mod = 1e9+7;
LL Dp[Max][2];
LL a[Max];
VI M[Max];
void DFS(int u, int fa)
{
Dp[u][0] = Dp[u][1] = 1;
for(int i = 0;i < M[u].size(); i++)
{
if(M[u][i] == fa) continue;
DFS(M[u][i], u);
int v = M[u][i];
Dp[u][0] = (((Dp[v][1] + 1) * Dp[u][0]) % Mod + (Dp[u][1] * Dp[v][0]) % Mod) % Mod;
Dp[u][1] = (Dp[u][1] * (Dp[v][1]+1)) % Mod;
}
}
class SubtreesCounting {
public:
int sumOfSizes(int, int, int, int, int);
};
int SubtreesCounting::sumOfSizes(int n, int a0, int b, int c, int m)
{
a[0] = a0;
for(int i = 1;i <= n-1; i++)
{
a[i] = (b * a[i-1] + c) % m;
}
for(int i = 1 ;i <= n-1; i++)
{
int j = a[i-1] % i;
M[i].push_back(j);
M[j].push_back(i);
}
LL ans = 0;
for(int i = 0; i < n; i++)
{
if(!Dp[i][0]) DFS(i,-1);
ans = (ans + Dp[i][0]) % Mod;
}
return ans;
}
Topcoder SRM 683 Div2 - C的更多相关文章
- Topcoder SRM 683 Div2 B
贪心的题,从左向右推过去即可 #include <vector> #include <list> #include <map> #include <set&g ...
- Topcoder Srm 673 Div2 1000 BearPermutations2
\(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...
- Topcoder Srm 671 Div2 1000 BearDestroysDiv2
\(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- Topcoder srm 632 div2
脑洞太大,简单东西就是想复杂,活该一直DIV2; A:水,基本判断A[I]<=A[I-1],ANS++; B:不知道别人怎么做的,我的是100*N*N;没办法想的太多了,忘记是连续的数列 我们枚 ...
- topcoder SRM 628 DIV2 BracketExpressions
先用dfs搜索所有的情况,然后判断每种情况是不是括号匹配 #include <vector> #include <string> #include <list> # ...
- topcoder SRM 628 DIV2 BishopMove
题目比较简单. 注意看测试用例2,给的提示 Please note that this is the largest possible return value: whenever there is ...
- Topcoder SRM 626 DIV2 SumOfPower
本题就是求所有连续子数列的和 开始拿到题目还以为求的时数列子集的和,认真看到题目才知道是连续子数列 循环遍历即可 int findSum(vector <int> array) { ; ; ...
- Topcoder SRM 626 DIV2 FixedDiceGameDiv2
典型的条件概率题目. 事件A在另外一个事件B已经发生条件下的发生概率.条件概率表示为P(A|B),读作“在B条件下A的概率”. 若只有两个事件A,B,那么, P(A|B)=P(AB)/P(B) 本题的 ...
随机推荐
- 设置一个顺手的Xcode
授权转载,作者:吴白(微博) 手指在键盘上飞速跳跃,终端上的代码也随着飞舞,是的这确实很酷.优秀的程序员总是这么一群人,他们不拘于现状,不固步自封,他们喜欢新奇的事,他们把自己发挥到极致. 指法攻略 ...
- MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- centos 查看版本(转)
# lsb_release -aLSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch ...
- form 提交数组的一些trick
在给服务器传值时form利用 $.post( "/member/member/book/" + event_id, { tickets: tickets, csrf_ppw_tok ...
- busybox rootfs 启动脚本分析(二)
上次分析了busybox的启动脚本,这次分析一下init.d中一些脚本的内容. 参考链接 http://www.cnblogs.com/helloworldtoyou/p/6169678.html h ...
- kafka集群搭建和使用Java写kafka生产者消费者
1 kafka集群搭建 1.zookeeper集群 搭建在110, 111,112 2.kafka使用3个节点110, 111,112 修改配置文件config/server.properties ...
- jsp页面常用控件
1.点击按钮返回 上一页: <input type="submit" value="返回" onclick="javascript :histo ...
- LUA学习笔记三·时间等操作系统库
1.构造时间 2.时间制定格式输出 3.计时器(闭包)os.difftime (t2, t1) 返回以秒计算的时刻 t1 到 t2 的差值. (这里的时刻是由 os.time 返回的值). 在 POS ...
- @overrive报错解决方案
有时将项目移到另一个环境里出现@overrive报错的情况,可以看看eclipse工具的编译设置,将编译版本设置高点.
- MWeb 1.7.1 版发布!支持导出为 RTF 和 Docx、发布到 Evernote 带样式、文档库备份和新网站主题等大量改进!
编辑器及发布服务改进 增加设置图片宽度和居左.居右.居中的语法. 如: 这样表示设置图片宽度为 450.其中 -w450 为设置语法,生成 HTML 时会自动 ...