[jzoj 5930] [NOIP2018模拟10.26】山花 解题报告 (质因数分类)
题目链接:
http://172.16.0.132/senior/#contest/show/2538/2
题目:
小S决定从某一个节点$u$开始对其子树中与$u$距离小于$K$的节点代表的花树进行采摘。
特别的,节点$u$代表的花树也会被采摘。依旧受限于精力,小S并不会亲自去采摘而是使用Extremely Strong的工具进行采摘。
我们定义一个工具的能力为$c$,小S会采摘的山树集合为$T$。那么小S能采摘到的山花数量$f_T = \prod _{i∈T} (a_i, c)$
现在对于给定的树和阀值$K$,小S想要知道每一组询问的$f_T$
题解:
考虑按质因数分类计算每个点的贡献
对于一个质因子,我们把询问$c$值和点权$a$值放在一起按照指数排序。
先从前往后扫,显然对于一个询问当前贡献为之前的点权指数之和;再从后往前扫,对于一个询问当前的贡献是后面的点的个数乘上当前询问的指数。这就是经典的通过排序确定大小关系后计算贡献的栗子
直接用树状数组在$dfs$序上维护即可
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll; const int N=1e5+;
const int mo=;
const int M=1e7+;
int n,Q,k,tot,tim,cnt,tp;
int t[N],dfn[N],pri[N],fk[N],ed[N],vis[M],head[N],fa[N],st[N];
ll ANS[N];
struct EDGE{
int to,nxt;
}edge[N<<];
struct QUE{
int x,c;
}q[N];
struct node{
int k,ty,id;
}ck[N<<];
bool operator < (node x,node y) {return x.k<y.k||(x.k==y.k&&x.ty<y.ty);}
vector <node> pi[N];
inline int read(){
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void div(int x,int ty,int id)
{
for (int i=;i*i<=x;i++)
{
if (x%i) continue;
int s=;
while (x%i==) x/=i,++s;
if (!vis[i]) pri[++cnt]=i,vis[i]=cnt;
pi[vis[i]].push_back((node){s,ty,id});
}
if (x>)
{
if (!vis[x]) pri[++cnt]=x,vis[x]=cnt;
pi[vis[x]].push_back((node){,ty,id});
}
}
void link(int u,int v){edge[++tot]=(EDGE){v,head[u]};head[u]=tot;}
void dfs(int x,int pre)
{
dfn[x]=++tim;st[++tp]=x;
if (tp>k) fk[x]=st[tp-k];
for (int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to;
if (y==pre) continue;
dfs(y,x);
}
tp--;ed[x]=tim;
}
void modify(int x,int y)
{
if (!x) return;
while (x<=n)
{
t[x]+=y;
x+=x&-x;
}
}
int query(int x)
{
int re=;
while (x)
{
re+=t[x];
x-=x&-x;
}
return re;
}
ll qpow(ll a,ll b)
{
ll re=;
for (;b;b>>=,a=a*a%mo) if (b&) re=re*a%mo;
return re;
}
int main()
{
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
n=read();Q=read();k=read();
for (int i=,a;i<=n;i++) a=read(),div(a,,i);
for (int i=,u,v;i<n;i++)
{
u=read();v=read();
link(u,v);link(v,u);
}
dfs(,);
for (int i=;i<=Q;i++)
{
q[i].x=read();q[i].c=read();
div(q[i].c,,i);
ANS[i]=;
}
for (int j=;j<=cnt;j++)
{
int pnt=pi[j].size();
sort(pi[j].begin(),pi[j].end());
memset(t,,sizeof(t));
for (int i=;i<pnt;i++)
{
int id=pi[j][i].id;
if (pi[j][i].ty==)
{
modify(dfn[fk[id]],-pi[j][i].k);
modify(dfn[id],pi[j][i].k);
}
else
{
int p=query(ed[q[id].x])-query(dfn[q[id].x]-);
(ANS[id]*=qpow(pri[j],p))%=mo;
}
}
for (int i=;i<pnt;i++)
{
int id=pi[j][i].id;
if (pi[j][i].ty==)
{
modify(dfn[fk[id]],pi[j][i].k);
modify(dfn[id],-pi[j][i].k);
}
}
for (int i=pnt-;i>=;i--)
{
int id=pi[j][i].id;
if (pi[j][i].ty==)
{
modify(dfn[fk[id]],-);
modify(dfn[id],);
}
else
{
int p=query(ed[q[id].x])-query(dfn[q[id].x]-);
(ANS[id]*=qpow(pri[j],p*pi[j][i].k))%=mo;
}
}
for (int i=pnt-;i>=;i--)
{
int id=pi[j][i].id;
if (pi[j][i].ty==)
{
modify(dfn[fk[id]],);
modify(dfn[id],-);
}
}
}
for (int i=;i<=Q;i++) printf("%lld\n",ANS[i]);
return ;
}
[jzoj 5930] [NOIP2018模拟10.26】山花 解题报告 (质因数分类)的更多相关文章
- [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)
题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...
- [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)
题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...
- [JZOJ 5895] [NOIP2018模拟10.5] 旅游 解题报告 (欧拉回路+最小生成树)
题目链接: https://jzoj.net/senior/#main/show/5895 题目: 题解: 有一个好像比较显然的性质,就是每条边最多经过两次 那么我们考虑哪些边需要经过两次.我们把需要 ...
- [JZOJ 5906] [NOIP2018模拟10.15] 传送门 解题报告(树形DP)
题目链接: https://jzoj.net/senior/#contest/show/2528/2 题目: 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传 ...
- [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)
题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才. ...
- [JZOJ 5894] [NOIP2018模拟10.5] 同余方程 解题报告(容斥)
题目链接: http://172.16.0.132/senior/#contest/show/2523/0 题目: 题解:(部分内容来自https://blog.csdn.net/gmh77/arti ...
- [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)
题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...
- [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)
题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...
- [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)
题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...
随机推荐
- 0x36 组合计数
组合计算的性质: C(n,m)= m! / (n!(m-n)!) C(n,m)=C(m-n,m); C(n,m)=C(n,m-1)+C(n-1,m-1); 二项式定理:(a+b)^n=sigema(k ...
- 机器学习 LR中的参数迭代公式推导——极大似然和梯度下降
Logistic本质上是一个基于条件概率的判别模型(DiscriminativeModel). 函数图像为: 通过sigma函数计算出最终结果,以0.5为分界线,最终结果大于0.5则属于正类(类别值为 ...
- ffmpeg x264编译与使用介绍
问题1:我用的是最新版本的ffmpeg和x264,刚刚编译出来,编译没有问题,但是在linux 环境使用ffmpeg的库时发现报错error C3861: 'UINT64_C': identifier ...
- CSDN日报20170527 ——《人机大战,历史的见证》
在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...
- MVC、控件、一般处理程序中的session and cookie
Mvc中: session: if (!string .IsNullOrEmpty(find)) //设置 Session["oip"] = "无锡"; Vie ...
- Java基础——增强for循环
java1.5版本引入了一个增强for循环,基本原理和for循环类似. 语法声明:for(表达式:条件表达式) 举例:for (String str : set) 解释:set代表set集合,str代 ...
- (转载)Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow
Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow 这是一张QQ空间说说详情的截图. 分析: 1.点击右上角三个点的图标,在界面底部弹出一个区域,这个 ...
- Oracle PL/SQL开发基础(第三十三弹:EXCEPTION_INIT)
如果有一些异常并没有异常名称,比如一些ORA-开头的异常并没有一个友好的预定义的异常定义,此时在WHEN子句中无法使用具体的异常名称,必须要使用OTHERS异常处理器进行捕捉.通过EXCEPTION_ ...
- Sphinx在windows下安装使用[支持中文全文检索]
原文地址:http://www.fuchaoqun.com/2008/11/sphinx-on-windows-xp/ 前 一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/ ...
- css3背景渐变以及图片混合渲染模式(一)
一.CSS3 渐变(Gradients):CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡. 以前,你必须使用图像来实现这些效果.但是,通过使用 CSS3 渐变(g ...