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 ...
随机推荐
- 自签证书 doesn't match any of the subject alternative names
出现这个的原因是https中的域名或者IP,与证书中登记的不一致. 如果是自签证书的话,可以根据具体需要重新生成证书. 还有一种解决方案是在java中跳过这个检查. 绕过检查分两类,一个是绕过证书在C ...
- Spring配置声明
<... xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="htt ...
- influxdb 命令
写入数据: curl -X POST -d '[{"name":"foo","columns":["val"],&quo ...
- 在DbGrid中,不按下Ctrl,单击鼠标如何实现多选?谢谢
解决方案 » 有了dbgrid1.options.dgmultiselect:=true;必须按下Ctrl键,才能实现多选, 修改源代码,把以下内容if Select and (ssShift i ...
- a标签不能嵌套
<a href='http://www.baidu.com'> <a href='http://www.google.com'></a> </a> &l ...
- 第116天: Ajax运用artTemplate实现菜谱
Ajax运用artTemplate实现菜谱 一.获取接口数据 1.聚合数据API https://www.juhe.cn,在这上面找到菜谱大全数据接口文档 具体使用是这样的: key后面的数据是 ...
- 【Java】判断字符串是否包含子字符串
JAVA里面判断: public static void main(String[] args) { String str="ABC_001"; if(str.indexOf(&q ...
- Qt 事件处理机制
Qt 事件处理机制 因为这篇文章写得特别好,将Qt的事件处理机制能够阐述的清晰有条理,并且便于学习.于是就装载过来了(本文做了排版,并删减了一些冗余的东西,希望原主勿怪),以供学习之用. 简介 在Qt ...
- 【题解】AC自动机题解合集
最近貌似大家都在搞字符串?很长一段时间都没有写博客了……还是补一补坑吧. 感觉AC自动机真的非常优美了,通过在trie树上建立fail指针可以轻松解决多模匹配的问题.实际上在AC自动机上的匹配可以看做 ...
- 【刷题】BZOJ 1095 [ZJOI2007]Hide 捉迷藏
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...