[CF986E]Prince's Problem
题意:给一棵带点权$w_i$的树,多次询问$(u,v,x)$,求出$\prod\limits_{i\in\text{path}(u,v)}(w_i,x)$
因为是乘法,所以可以把路径询问拆成到根询问,这样就可以离线做了
因为求$\gcd$的本质是质因数指数取$\min$,所以在离线dfs时每到一个点就把它的点权质因数分解打上标记然后统计答案即可
具体地,对于$w_x=\prod\limits_{i=1}^kp_i^{a_i}$,我们把每个$p_i$的$1\cdots a_i$次幂乘上$p_i$的标记,统计答案时对$x=\prod\limits_{i=1}^kp_i^{a_i}$,对每个$p_i$都往答案乘上$[1,a_i]$的标记即可,dfs退栈时除回去以撤销
#include<stdio.h>
#include<vector>
using namespace std;
typedef long long ll;
const int mod=1000000007,T=10000000;
int mul(int a,int b){return a*(ll)b%mod;}
int pr[10000010],d[10000010],s[10000010];
int pow(int a,int b){
int s=1;
while(b){
if(b&1)s=mul(s,a);
a=mul(a,a);
b>>=1;
}
return s;
}
void sieve(){
int i,j,M;
M=0;
d[1]=1;
s[1]=1;
for(i=2;i<=T;i++){
s[i]=1;
if(d[i]==0){
M++;
pr[M]=d[i]=i;
}
for(j=1;j<=M;j++){
if(pr[j]*(ll)i>T)break;
d[i*pr[j]]=pr[j];
if(i%pr[j]==0)break;
}
}
}
int h[100010],nex[200010],to[200010],dep[100010],fa[100010][17],M;
void add(int a,int b){
M++;
to[M]=b;
nex[M]=h[a];
h[a]=M;
}
void dfs(int x){
dep[x]=dep[fa[x][0]]+1;
for(int i=h[x];i;i=nex[i]){
if(to[i]!=fa[x][0]){
fa[to[i]][0]=x;
dfs(to[i]);
}
}
}
int lca(int x,int y){
int i;
if(dep[x]<dep[y])swap(x,y);
for(i=16;i>=0;i--){
if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
}
if(x==y)return x;
for(i=16;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
struct par{
int x,f;
par(int a=0,int b=0){x=a;f=b;}
};
vector<par>v[100010];
int a[100010],val[100010],ans[100010];
void solve(int x){
int i,j,t;
for(i=a[x];i>1;){
for(j=t=d[i];i%t==0;i/=t,j*=t)s[j]=mul(s[j],t);
}
for(par p:v[x]){
for(i=val[p.x];i>1;){
for(j=t=d[i];i%t==0;i/=t,j*=t)ans[p.x]=mul(ans[p.x],p.f?s[j]:pow(s[j],mod-2));
}
}
for(i=h[x];i;i=nex[i]){
if(to[i]!=fa[x][0])solve(to[i]);
}
for(i=a[x];i>1;){
for(j=t=d[i];i%t==0;i/=t,j*=t)s[j]=mul(s[j],pow(t,mod-2));
}
}
int main(){
sieve();
int n,q,i,j,x,y;
scanf("%d",&n);
for(i=1;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(i=1;i<=n;i++)scanf("%d",a+i);
dfs(1);
for(j=1;j<17;j++){
for(i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];
}
scanf("%d",&q);
for(i=1;i<=q;i++){
scanf("%d%d%d",&x,&y,val+i);
j=lca(x,y);
v[x].push_back(par(i,1));
v[y].push_back(par(i,1));
v[j].push_back(par(i,0));
v[fa[j][0]].push_back(par(i,0));
ans[i]=1;
}
solve(1);
for(i=1;i<=q;i++)printf("%d\n",ans[i]);
}
[CF986E]Prince's Problem的更多相关文章
- 【题解】CF986E Prince's Problem(树上差分+数论性质)
[题解]CF986E Prince's Problem(树上差分+数论性质) 题目大意: 给定你一棵树,有点权\(val_i\le 10^7\).现在有\(m\)组询问给定参数\(x,y,w\)问你对 ...
- [Codeforces 986E] Prince's Problem
[题目链接] https://codeforces.com/contest/986/problem/E [算法] X到Y的路径积 , 可以转化为X到根的路径积乘Y到根的路径积 , 除以LCA到根的路径 ...
- Codeforces986E Prince's Problem 【虚树】【可持久化线段树】【树状数组】
我很喜欢这道题. 题目大意: 给出一棵带点权树.对每个询问$ u,v,x $,求$\prod_{i \in P(u,v)}gcd(ai,x)$.其中$ P(u,v) $表示$ u $到$ v $的路径 ...
- Codeforces 986E - Prince's Problem(树上前缀和)
题面传送门 题意: 有一棵 \(n\) 个节点的树,点上有点权 \(a_i\),\(q\) 组询问,每次询问给出 \(u,v,w\),要求: \(\prod\limits_{x\in P(u,v)}\ ...
- 超强语感训练文章(Provided by Rocky teacher Prince)
Content: Class1 My name is Prince Class2 Welcome to our hotel Class3 We’re not afraid of problems Cl ...
- 强连通+二分匹配(hdu4685 Prince and Princess)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- 10635 - Prince and Princess
Problem D Prince and Princess Input: Standard Input Output: Standard Output Time Limit: 3 Seconds In ...
- UVa10653.Prince and Princess
题目连接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Prince and Princess HDU - 4685(匹配 + 强连通)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
随机推荐
- Faster R-CNN教程
Faster R-CNN教程 最后更新日期:2016年4月29日 本教程主要基于python版本的faster R-CNN,因为python layer的使用,这个版本会比matlab的版本速度慢10 ...
- php文件上传错误代码
注意: 1.上传文件的时候,在html里面的form表单一定要标注:enctype='multipart/form-data' 2.有种说法,要求一定要在form表单里面,在file前面加上隐藏域如: ...
- 解决在ios下不能自动播放音频的问题
在ios下面是不允许自动播放音频这个操作的,不过我们可以使用微信提供的sdk来做到自动播放音乐的功能 wx.ready(()=>{}) 引入微信的sdk,之后在回调函数里面执行主动触发背景音乐播 ...
- 封装常用的Javascript跨浏览器方法
var EventUntil={ // 跨浏览器的添加事件方法 addHandler:function(element,type,handler){ if(element.addEventListen ...
- 大数问题,通常用JAVA
e.g. HDU1002 简单加法 import java.math.BigInteger; import java.util.Scanner; public class Main { public ...
- Python基础(2)_if、for、while流程控制
一.流程控制 1.条件语句 1.1单分支 1.2多分支 条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. a = 5 if a > 2: print('yes') 根据Py ...
- 「6月雅礼集训 2017 Day2」C
[题目大意] 有一棵n个点的完全二叉树,边权均为1,每个点有小鸟容量c[i] 依次来了m只小鸟,第i只小鸟初始位置在pos[i]上,问来了x只小鸟的时候,怎样安排小鸟的路线可以使得小鸟移动的边权和最小 ...
- android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析
学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景. 在目前 android 提供的开发环境里,如果要编写 c / ...
- postman接口间关联
现有A.B两个接口,A接口返回的response的body中的部分数据,是B接口发起请求部分数据的来源. A接口response的body结构如下: { "address": &q ...
- 什么时候该用 Apache Kafka
rabbitMQ kafka https://coyee.com/article/12091-understanding-when-to-use-rabbitmq-or-apache-kafka Ap ...