Description

给一棵树,每个点有点权 \(a_i\) ,每次给 \(u,v,x\) ,求 \(u\) 到 \(v\) 路径上每个点的点权与 \(x\) 的 \(gcd\) 的积。

\(n,m\le 10^5,1\le a_i\le 10^7\)

Solution

离线,答案相当与四条从根出发的链拼起来,分解质因数。

#include<bits/stdc++.h>
using namespace std;template <class T> void read(T &x) {x = 0; bool flag = 0; char ch = getchar(); for (; ch < '0' || ch > '9'; ch = getchar()) flag |= ch == '-';for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - 48; flag ? x = ~x + 1 : 0;
}//#pragma GCC diagnostic error "-std=c++14"#define N 100010
#define rep(i, a, b) for (auto i = (a); i <= (b); ++i)
#define drp(i, a, b) for (auto i = (a); i >= (b); --i)
#define P 1000000007bool notPri[10000010];
int pri[664580 + 10], priCnt;void init(int n) {int m = sqrt(n + 0.5);rep(i, 2, m) if (!notPri[i]) for (int j = i * i; j <= n; j += i) notPri[j] = 1;rep(i, 2, n) if (!notPri[i]) pri[++priCnt] = i;
}vector<int> g[N];int fa[N][18], dep[N];
void dfs(int u) {rep(i, 1, 17) fa[u][i] = fa[fa[u][i - 1]][i - 1];for (int v : g[u]) if (v ^ fa[u][0]) fa[v][0] = u, dep[v] = dep[u] + 1, dfs(v);
}int getLca(int u, int v) {if (dep[u] < dep[v]) swap(u, v);drp(i, 17, 0) if (dep[fa[u][i]] >= dep[v]) u = fa[u][i]; if (u == v) return u;drp(i, 17, 0) if (fa[u][i] ^ fa[v][i]) u = fa[u][i], v = fa[v][i]; return fa[u][0];
}struct Data {int x, id;bool type;Data(int x = 0, int id = 0, bool type = 0) : x(x), id(id), type(type) {}
};vector<Data> q[N];int qpow(int x, int k) {int ret = 1;for (; k; k >>= 1, x = 1ll * x * x % P) if (k & 1) ret = 1ll * ret * x % P;return ret;
}int a[N], ans[N], cnt[664580 + 10][25];void update(int val, int del) {for (int i = 1; 1ll * pri[i] * pri[i] <= val; ++i) if (val % pri[i] == 0) {int p = 0;for (; val % pri[i] == 0; val /= pri[i], ++p);cnt[i][p] += del;}if (val != 1) cnt[lower_bound(pri + 1, pri + 1 + priCnt, val) - pri][1] += del;
}int query(int val) {int ret = 1;for (int i = 1; 1ll * pri[i] * pri[i] <= val; ++i) if (val % pri[i] == 0) {int p = 0, t = 0;for (; val % pri[i] == 0; val /= pri[i], ++p);rep(j, 1, p) t += cnt[i][j] * j;rep(j, p + 1, 24) t += cnt[i][j] * p;ret = 1ll * ret * qpow(pri[i], t) % P;}if (val == 1) return ret;int pos = lower_bound(pri + 1, pri + 1 + priCnt, val) - pri;int t = 0;rep(i, 1, 24) t += cnt[pos][i];return 1ll * ret * qpow(val, t) % P;
}void solve(int u) {update(a[u], 1);for (auto t : q[u]) {if (t.type) ans[t.id] = 1ll * ans[t.id] * query(t.x) % P;else ans[t.id] = 1ll * ans[t.id] * qpow(query(t.x), P - 2) % P;}for (int v : g[u]) if (v != fa[u][0]) solve(v);update(a[u], -1);
}#define pb push_backint main() {init(10000000);int n, m; read(n);rep(i, 2, n) {int u, v; read(u), read(v);g[u].pb(v), g[v].pb(u);}dep[1] = 1; dfs(1);rep(i, 1, n) read(a[i]);read(m);rep(i, 1, m) {int u, v, x; read(u), read(v), read(x);int lca = getLca(u, v);ans[i] = 1;q[u].pb(Data(x, i, 1)), q[v].pb(Data(x, i, 1)), q[lca].pb(Data(x, i, 0));if (lca != 1) q[fa[lca][0]].pb(Data(x, i, 0));}solve(1);rep(i, 1, m) printf("%d\n", ans[i]);return 0;
}

转载于:https://www.cnblogs.com/aziint/p/9752455.html

CodeForces - 986E Prince's Problem相关推荐

  1. Codeforces 776D The Door Problem

    题目链接:http://codeforces.com/contest/776/problem/D 把每一个钥匙拆成两个点${x,x+m}$,分别表示选不选这把钥匙. 我们知道一扇门一定对应了两把钥匙. ...

  2. codeforces C. Sonya and Problem Wihtout a Legend(dp or 思维)

    题目链接:http://codeforces.com/contest/713/problem/C 题解:这题也算是挺经典的题目了,这里附上3种解法优化程度层层递进,还有这里a[i]-i<=a[i ...

  3. 【CodeForces - 706C】Hard problem(dp,字典序)

    题干: Vasiliy is fond of solving different tasks. Today he found one he wasn't able to solve himself, ...

  4. Codeforces 1000D Yet Another Problem On a Subsequence 动态规划

    D. Yet Another Problem On a Subsequence time limit per test 2 seconds memory limit per test 256 mega ...

  5. CodeForces - 1000D Yet Another Problem On a Subsequence(动态规划+组合数学)

    题目链接:点击查看 题目大意:给出n个数字组成的序列,现在规定"好数组"指的是一个连续序列a1,a2,...ak的a1=k-1,再规定"好序列"是可以分为若干个 ...

  6. 【CodeForces - 1096D】Easy Problem(dp,思维)

    题目大意: 现在有一个由小写字母组成的字符串,去掉这个字符串的第i个位置的字符会有ai的代价.你的任务是去掉这个字符串中的一些字符使得该字符串中不包含子序列hard,且去掉字符的代价之和尽可能小. 输 ...

  7. 【Codeforces 1096D】Easy Problem

    [链接] 我是链接,点我呀:) [题意] 让你将一个字符串删掉一些字符. 使得字符串中不包含子序列"hard" 删掉每个字符的代价已知为ai 让你求出代价最小的方法. [题解] 设 ...

  8. CodeForces 464E The Classic Problem | 呆克斯歘 主席树维护高精度

    题意描述 有一个\(n\)点\(m\)边的无向图,第\(i\)条边的边权是\(2^{a_i}\).求点\(s\)到点\(t\)的最短路长度(对\(10^9 + 7\)取模). 题解 思路很简单--用主 ...

  9. Codeforces 1000D Yet Another Problem On a Subsequence

    题目:点击打开链接 题意:定义一个数列是"好的":第一个数字a[0]为数列长度+1.定义一个数列的子序列是"好的":这个子序列能分割成几个"好的&qu ...

最新文章

  1. 感觉没有学会什么真正的本领
  2. 中国AI服务器,刷新全球18项性能基准测试纪录
  3. 2440从sd卡启动wince
  4. C#学习笔记--详解委托,事件与回调函数
  5. Sequential 顺序模型和 Model 模型【TensorFlow2入门手册】
  6. boost::hana::reverse用法的测试程序
  7. 律师坚称技术无罪:“钉钉打卡神器”开发者二审被改判四年
  8. android h5页面跳转,android H5 应用内跳转Scheme协议
  9. CentOS7 Docker 安装 PHP,Mysql,phpmyadmin
  10. rss feed for testing
  11. 2021-10-11 全国大学生软件测试大赛赛前学习参考资料
  12. SQL获取当前月份的第一天
  13. 宝塔Linux面板redis服务开多个端口
  14. 几行代码轻松实现百度定位和在地图显示指定坐标
  15. 小孔成像模型中四个坐标系的转换:世界 相机光心 图像毫米 像素
  16. java用for打印正方形_Java程序为给定的整数打印正方形图案
  17. 数字信号处理matlab实验报告,数字信号处理,matlab实验报告
  18. 还搭不出来服务链路追踪Spring Cloud Sleuth?
  19. 吴恩达机器学习——编程语言Matlab基本操作
  20. 谷歌基因测试软件,谷歌发布了一款AI工具 可以帮助基因组数据解读

热门文章

  1. 前端必须掌握30个CSS3选择器
  2. 解决岛屿类问题(网格)通用解法DFS(附题)
  3. FFmpeg源代码简单分析:结构体成员管理系统-AVOption
  4. python zip dict_关于python:zip(list)和zip(* list)之间的区别
  5. 表面粗糙度的基本评定参数是_表面粗糙度100个常见问题
  6. 计算机上机单招试题及答案,全国高职单招计算机类模拟试卷考卷及答案
  7. Spring依赖注入static静态变量相关问题
  8. 第45届ICPC 昆明站 临时模板补充
  9. java取余位运算_Java中对于位运算的优化以及运用与思考
  10. 应用系统运行监控界面_重庆悦来会展二期电力监控系统的设计与应用