K. Random Numbers(Gym 101466K + 线段树 + dfs序 + 快速幂 + 唯一分解)
题目链接:http://codeforces.com/gym/101466/problem/K
题目:



题意:
给你一棵有n个节点的树,根节点始终为0,有两种操作:
1.RAND:查询以u为根节点的子树上的所有节点的权值的乘积x,及x的因数个数。
2.SEED:将节点u的权值乘以x。
思路:
比赛时少看了因数不大于13这句话,然后本题难度增加数倍,肝了两个小时都没肝出来,对不起队友啊,今天的组队训练赛实力背锅……
这题一眼线段树,由于是对一棵子树进行处理,因此我们采用常规套路,借助dfs序将子树变成区间。不过因为权值的乘积太大,还要取模,一个数取模后因数个数也会发生变化,所以我们肯定不能用它的权值来进行建树,因而我们可以将思路进行转化,先将它的每个节点的权值进行唯一分解,对指数进行建树。
对于最后的答案,第一个乘积x很容易求,用快速幂对2,3,5,7,11,13这六个素数进行处理即可。而第二个答案,我们根据数论知识知道它的结果是∏(1+ci),其中ci为某个因数pi的指数。
代码实现如下:
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;;
typedef pair<int, int> pii;
typedef unsigned long long ull; #define lson i<<1
#define rson i<<1|1
#define lowbit(x) x&(-x)
#define bug printf("*********\n");
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define FIN freopen("D://code//in.txt", "r", stdin);
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = 1e9 + ;
const int maxn = 1e5 + ;
const int mx = 1e4 + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f; int n, tot, q, u, v, x, p, a, b;
char op[];
int prime[] = {, , , , , }, cnt[], ans[];
int val[maxn], head[maxn], s[maxn], t[maxn]; struct edge {
int v, next;
}ed[maxn]; struct node {
int l, r;
int num[];
}segtree[maxn<<]; void addedge(int u, int v) {
ed[tot].v = v;
ed[tot].next = head[u];
head[u] = tot++;
} void dfs(int u) {
s[u] = ++x;
for(int i = head[u]; ~i; i = ed[i].next) {
int v = ed[i].v;
dfs(v);
}
t[u] = x;
} void push_up(int i) {
for(int j = ; j < ; j++) {
segtree[i].num[j] = (segtree[lson].num[j] + segtree[rson].num[j]) % mod;
}
} void build(int i, int l, int r) {
segtree[i].l = l, segtree[i].r = r;
for(int j = ; j < ; j++) {
segtree[i].num[j] = ;
}
if(l == r) {
for(int j = ; j < ; j++) {
if(val[l] % prime[j] == ) {
while(val[l] % prime[j] == ) {
segtree[i].num[j]++;
val[l] /= prime[j];
}
}
}
return;
}
int mid = (l + r) >> ;
build(lson, l, mid);
build(rson, mid + , r);
push_up(i);
} void update(int i, int pos, int cnt[]) {
if(segtree[i].l == pos && segtree[i].r == pos) {
for(int j = ; j < ; j++) {
segtree[i].num[j] = (segtree[i].num[j] + cnt[j]) % mod;
}
return;
}
int mid = (segtree[i].l + segtree[i].r) >> ;
if(pos <= mid) update(lson, pos, cnt);
else update(rson, pos, cnt);
push_up(i);
} int Mod_Pow(int x, int n) {
int res = ;
while(n) {
if(n & ) res = (ll) res * x % mod;
x = (ll)x * x % mod;
n >>= ;
}
return res;
} void query(int i, int l, int r, int ans[]) {
if(segtree[i].l == l && segtree[i].r == r) {
for(int j = ; j < ; j++) {
ans[j] += segtree[i].num[j];
}
return;
}
int mid = (segtree[i].l + segtree[i].r) >> ;
if(r <= mid) query(lson, l, r, ans);
else if(l > mid) query(rson, l, r, ans);
else {
query(lson, l, mid, ans);
query(rson, mid + , r, ans);
}
} int main() {
//FIN;
tot = x = ;
memset(head, -, sizeof(head));
scanf("%d", &n);
for(int i = ; i < n; i++) {
scanf("%d%d", &u, &v);
u++, v++;
addedge(u, v);
}
dfs();
for(int i = ; i <= n; i++) {
scanf("%d", &p);
val[s[i]] = p;
}
build(, , n);
scanf("%d", &q);
while(q--) {
scanf("%s", op);
if(op[] == 'R') {
scanf("%d", &a);
a++;
for(int i = ; i < ; i++) ans[i] = ;
query(, s[a], t[a], ans);
ll cnt1 = , cnt2 = ;
for(int i = ; i < ; i++) {
cnt2 = (cnt2 * (( + ans[i]) % mod)) % mod;
cnt1 = (cnt1 * Mod_Pow(prime[i], ans[i])) % mod;
}
printf("%lld %lld\n", cnt1, cnt2);
} else {
scanf("%d%d", &a, &b);
a++;
for(int j = ; j < ; j++) {
cnt[j] = ;
if(b % prime[j] == ) {
while(b % prime[j] == ) {
cnt[j]++;
b /= prime[j];
}
}
}
update(, s[a], cnt);
}
}
return ;
}
K. Random Numbers(Gym 101466K + 线段树 + dfs序 + 快速幂 + 唯一分解)的更多相关文章
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Random Numbers Gym - 101466K dfs序+线段树
Tamref love random numbers, but he hates recurrent relations, Tamref thinks that mainstream random g ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- Codeforces 343D WaterTree - 线段树, DFS序
Description Translated by @Nishikino_Maki from Luogu 行吧是我翻的 Mad scientist Mike has constructed a roo ...
随机推荐
- 【Leetcode】 328. Odd Even Linked List
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...
- 使用Kettle导出excel
1.开发背景 在web项目中,经常会需要查询数据导出excel,以前比较常见的就是用poi.使用poi的时候也有两种方式,一种就是直接将集合一次性导出为excel,还有一种是分批次追加的方式适合数据量 ...
- mysql子查询批量找id最大的
$sql = "select a.id as max_id,a.uid from(SELECT `uid`, idFROM (`users_level_change_log`)WHERE ` ...
- 【C++】new和delete表达式与内存管理
new和delete表达式可以用来动态创建和释放单个对象,也可以用来动态创建和释放动态数组. 定义变量时,必须指定其数据类型和名字.而动态创建对象时,只需指定其数据类型,而不必为该对象命名.new表达 ...
- java面试及答案
优秀总结博客 mybatis总结 java并发包相关 一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. hashmap3.反射中,Class. ...
- caffe框架下目标检测——faster-rcnn实战篇操作
原有模型 1.下载fasrer-rcnn源代码并安装 git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git 1) ...
- 使用expect实现自动登录的脚本
使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ######## ...
- 用centos 6.5 webservice 安装系统后的问题
编译pcre时:缺少一下库: yum -y install gcc yum -y install gcc-c++
- Yarn 模式 与 电影受众分析系统
yarn模式分为两种模式: 一.Yarn-cluster模式 1.通过spark-submit提交spark jar包(Application),与RM进行通信请求启动AM 2.RM接收到请求之后,会 ...
- Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)
一.HttpClient (一)HttpClient 客户端 1.HttpClient 是 apache 的开源,需要引入两个包:httpclient-4.2.4.jar 和 httpcore-4.2 ...