[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 ...
随机推荐
- POJ3020:Antenna Placement(二分图匹配)
Antnna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11093 Accepted: 5459 ...
- eclipse关闭错误警告提示
- Google File System中文版
英文原文地址: Google File system 译文原文地址: The Google File System中文版 Google File System中文版 摘要 我们设计并实现了Google ...
- nginx,docker反向代理
1. [root@javanginx ~]# cat /etc/nginx/nginx.conf user root root;worker_processes 4;error_log /var/lo ...
- 清理/var/spool/clientmqueue目录释放大量空间
清理/var/spool/clientmqueue目录可以释放大量空间,具体命令是:ls | xargs rm -f 文件太大,rm -rf会由于参数太多而无法删除,所以需要用上面的命令. “Argu ...
- The 'brew link' step did not complete successfully
在mac 上更新node时遇到了一系列的问题: 卸载node重新安装之后提示: The 'brew link' step did not complete successfully 其实这里已经给出了 ...
- js密码的匹配正则
匹配的密码是 数字大写或者小写的字母.符号. if(pwd.match(/[\d]/) && pwd.match(/[A-Za-z]/) && pwd.match(/[ ...
- bzoj2811 [Apio2012]Guard
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2811 [题解] 首先我们先把没看到忍者的段去掉,可以用线段树做. 如果剩下的就是K,那么特判 ...
- HTML5之FileReader的简易使用
用来把文件读入内存,并且读取文件中的数据.FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据.FileReader接口提供了读取文件的方法 ...
- Mysql TEXT类型长度
BLOBTEXT一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符. MEDIUMBLOBMEDIUMTEXT一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字 ...