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 ...
随机推荐
- Alpha阶段事后诸葛亮分析
事后诸葛亮分析 一.设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件可供各类人群闲暇时间消遣娱乐,锻炼脑力. 定义的很清楚,就是一个定位 ...
- 一些Redis面试题
1. 使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,li ...
- Java ISO 8601时间格式转换
common-lang包: String pattern = "YYYY-MM-dd'T'HH:mm:ssZZ"; System.out.println(DateFormatUti ...
- Git回滚merge操作
执行完merge操作后,没有修改代码 1.命令 ⑴ git reflog 查看merge操作的上一个提交记录的版本号 ⑵ git reset –hard 版本号 这样可以回滚到merge之前的状态 2 ...
- AFNetworking你最最最起码要知道的基本使用~
AFNetworking是一个在iOS开发中,使用非常多的一个开源库 适用于iOS以及Mac OS X, 它构建于在(Apple iOS开发文档)NSURLConnection, NSOperatio ...
- Ubuntu 18.04开发环境部署流程
部署流程 安装系统 安装Eclipse和jre 配置系统 安装辅助工具 安装系统 用安装盘安装即可. 一般boot 1G,swap按内存大小,home 20G,根剩余. 安装Eclipse和jre 解 ...
- robot framework Selenium2关键字介绍
*** Settings *** Library Selenium2Library *** Keywords *** Checkbox应该不被选择 [Arguments] ${locator} Che ...
- P1065 作业调度方案
题目描述 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间. 每个工件的每个工序称为一个操作,我们用记号j−k表示一个 ...
- java学习2-webserver测试工具soapUI使用
file-->new soap project-->输入project Name(随便)输入 WSDL地址,其他默认,点ok展开左侧加载的项目下的方法名,双击Request ,右侧出现测试 ...
- spark(二)
一.spark的提交模式 --master(standalone\YRAN\mesos) standalone:-client -cluster 如果我们用client模式去提交程序,我们在哪个地方 ...