http://acm.bnu.edu.cn/v3/problem_show.php?pid=52733

【题意】

  • 给定一棵树,这棵树每个点都有一个点权,标号从0开始,0是根结点
  • 修改操作:
    SEED 1 13

    把结点1的点权乘上13

  • 查询操作:
    RAND 1

    查询结点1为根的子树所有结点权的总乘积,以及这个总乘积有多少个因子

  • 题目保证结果的质因子最大为13

【思路】

  • 质因子最大为13,那么我们可以枚举质因子2 3 5 7 11 13,共6个
  • 只要我们知道子树乘积这六个质因子的个数,我们就能算出子树的总乘积为2^p1*3^p2*5^p3*7^p4*11^p5*13^p6,而且这个数共有(p1+1)*(p2+1)*(p3+1)*(p4+1)*(p5+1)*(p6+1)个因子
  • 我们可以为每个质因子维护一个树状数组,统计因子个数和

【AC】

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn=1e5+;;
const int maxm=*maxn;
const ll mod=1e9+;
int n;
struct edge
{
int to;
int nxt;
}e[maxm];
int head[maxn];
int tot;
int l[maxn],r[maxn];
int cid;
ll tree[][maxm];
int p[];
ll fpow(ll x,ll n)
{
ll res=;
while(n)
{
if(n&) res=(res*x)%mod;
x=(x*x)%mod;
n>>=;
}
return res;
}
int lowbit(int x)
{
return x&(-x);
} void add(int i,int k,int cnt)
{
while(k<=cid)
{
tree[i][k]+=cnt;
k+=lowbit(k);
}
}
ll query(int i,int k)
{
int res=;
while(k)
{
res+=tree[i][k];
k-=lowbit(k);
}
return res;
}
void init()
{
memset(head,-,sizeof(head));
tot=;
cid=;
memset(tree,,sizeof(tree));
}
void addedge(int u,int v)
{
e[tot].to=v;
e[tot].nxt=head[u];
head[u]=tot++;
}
void dfs(int u,int pa)
{
l[u]=++cid;
for(int i=head[u];i!=-;i=e[i].nxt)
{
int v=e[i].to;
if(v==pa) continue;
dfs(v,u);
}
r[u]=++cid;
} void update(int i,ll x)
{
for(int j=;j<=;j++)
{
int cnt=;
while(x%p[j]==)
{
cnt++;
x/=p[j];
}
add(j,l[i],cnt);
}
}
int main()
{
p[]=,p[]=,p[]=,p[]=,p[]=,p[]=;
while(~scanf("%d",&n))
{
init();
int u,v;
for(int i=;i<=n-;i++)
{
scanf("%d%d",&u,&v);
u++;v++;
addedge(u,v);
addedge(v,u);
}
dfs(,-);
for(int i=;i<=n;i++)
{
ll x;
scanf("%I64d",&x);
update(i,x);
}
int q;
scanf("%d",&q);
char str[];
while(q--)
{
scanf("%s",str);
if(str[]=='R')
{
int x;
scanf("%d",&x);
x++;
ll cnt=;
ll ans=;
for(int i=;i<=;i++)
{
int tmp=query(i,r[x])-query(i,l[x]-);
cnt=cnt*(ll)(tmp+)%mod;
ans=(ans*fpow(p[i],tmp))%mod;
}
printf("%I64d %d\n",ans,cnt);
}
else
{
int k;
ll x;
scanf("%d%I64d",&k,&x);
k++;
update(k,x);
} }
}
return ;
}

树状数组

最新文章

  1. bzoj3631树链剖分
  2. web项目知识整理
  3. 什么是OAuth授权?
  4. 基于SSH2的OA项目1.1_20161207_业务开发
  5. hadoop2.x NameNode 的共享存储实现
  6. .NET MVC控制器向视图传递数据的四种方式
  7. dwr消息推送
  8. Java笔试知识总结(第一回)
  9. jquery获取元素方式
  10. XPath &lt;第四篇&gt;
  11. SQL Server 日期函数:某天是星期几?
  12. 海康/大华 IpCamera RTSP地址和格式
  13. jquery四种监听事件的区别
  14. C#之字符串
  15. 广州.NET微软技术俱乐部提技术问题的正确方式
  16. (四)Java工程化--Git基础
  17. CentOS_6.5配置iptables防火墙策略
  18. LoadRunner Vuser接口测试脚本 Post举例
  19. Cobbler 登录web界面提示报错“Internal Server Error”解决办法
  20. 文献管理软件zotero的一点使用感受作者: 杨林畅

热门文章

  1. 浅析linux下软件的安装
  2. SQL 数学串函数
  3. HDU 1561 The more, The Better (树形DP,常规)
  4. 中国剩余定理&amp;Lucas定理&amp;按位与——hdu 5446
  5. 如何用node命令和webpack命令传递参数
  6. AC自动机讲解+[HDU2222]:Keywords Search(AC自动机)
  7. iOS 第三方类库之MBProgressHUD
  8. 转: opencv4.0.0 +opencv_contrib在vs2015中编译
  9. MariaDB数据库(四)
  10. 如何删除SQL Server 2014连接到服务器中的服务器名称