题意:

给定一棵 n 个点的树,每个点有权值 Vi

问是否存在一条路径使得路径上所有点的权值乘积 mod(10^6 + 3) 为 K

输出路径的首尾标号,若有多解,输出字典序最小的解

对于100%的数据,有1≤n≤10^5,0≤K≤10^6+2,1≤vi ≤10^6+2

思路:RYZ作业

预处理逆元

哈希路径权值乘积的模数,保存编号用来查询

 const mo=;
var head,vet,next,len,flag,son:array[..]of longint;
f:array[..]of longint;
dis,a:array[..]of int64;
q:array[..,..]of longint;
exf:array[..mo]of int64;
hash:array[..mo]of longint;
n,m,i,j,tot,x,y,z,ans1,ans2,sum,root,top,k:longint; procedure add(a,b:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
head[a]:=tot;
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; function getroot(u,fa:longint):longint;
var e,v:longint;
begin
son[u]:=; f[u]:=;
e:=head[u];
while e<> do
begin
v:=vet[e];
if (v<>fa)and(flag[v]=) then
begin
getroot(v,u);
son[u]:=son[u]+son[v];
f[u]:=max(f[u],son[v]);
end;
e:=next[e];
end;
f[u]:=max(f[u],sum-f[u]);
if f[u]<f[root] then root:=u;
end; procedure dfs(u,fa:longint);
var e,v:longint;
begin
inc(top); q[top,]:=dis[u]; q[top,]:=u;
e:=head[u];
while e<> do
begin
v:=vet[e];
if (v<>fa)and(flag[v]=) then
begin
dis[v]:=dis[u]*a[v] mod mo;
dfs(v,u);
end;
e:=next[e];
end;
end; procedure cmp(x,id:longint);
var y:longint;
begin
x:=exf[x]*k mod mo;
y:=hash[x];
if y= then exit;
if y>id then swap(y,id);
if (y<ans1)or((y=ans1)and(id<ans2)) then
begin
ans1:=y; ans2:=id;
end;
end; procedure solve(u:longint);
var e,v,i,now:longint;
begin
flag[u]:=; hash[a[u]]:=u;
e:=head[u];
while e<> do
begin
v:=vet[e];
if flag[v]= then
begin
top:=; dis[v]:=a[v];
dfs(v,u);
for i:= to top do cmp(q[i,],q[i,]); //对于每一个子树,因为不能重复计算u这个根结点,分别计算子树内结果,后面再用加上根结点的答案更新
top:=; dis[v]:=a[u]*a[v] mod mo;
dfs(v,u);
for i:= to top do
begin
now:=hash[q[i,]];
if (now=)or(q[i,]<now) then hash[q[i,]]:=q[i,]; //用子树中的路径加上根结点,更新经过根结点的答案
end;
end;
e:=next[e];
end;
hash[a[u]]:=;
e:=head[u];
while e<> do
begin
v:=vet[e];
if flag[v]= then
begin
top:=; dis[v]:=a[u]*a[v] mod mo;
dfs(v,u);
for i:= to top do hash[q[i,]]:=; //清空所有信息
end;
e:=next[e];
end;
e:=head[u];
while e<> do
begin
v:=vet[e];
if flag[v]= then
begin
root:=; sum:=son[v];
getroot(v,);
solve(root);
end;
e:=next[e];
end;
end; begin
assign(input,'hdoj4812.in'); reset(input);
assign(output,'hdoj4812.out'); rewrite(output);
exf[]:=; exf[]:=;
for i:= to do exf[i]:=exf[mo mod i]*(mo-mo div i) mod mo;
while not eof do
begin
// fillchar(head,sizeof(head),);
//fillchar(flag,sizeof(flag),);
for i:= to n do
begin
head[i]:=; flag[i]:=;
end;
tot:=; ans1:=maxlongint; ans2:=maxlongint;
read(n,k);
if n= then break;
for i:= to n do read(a[i]);
for i:= to n- do
begin
read(x,y);
add(x,y);
add(y,x);
end;
root:=; sum:=n; f[]:=n+;
getroot(,);
solve(root);
if ans1=maxlongint then writeln('No solution')
else writeln(ans1,' ',ans2);
end;
close(input);
close(output);
end.

【HDOJ4812】D Tree(点分治)的更多相关文章

  1. hdoj4812 D Tree(点分治)

    题目链接:https://vjudge.net/problem/HDU-4812 题意:给定一颗带点权的树,求是否存在一条路经的上点的权值积取模后等于k,如果存在多组点对,输出字典序最小的. 思路: ...

  2. 【BZOJ-1468】Tree 树分治

    1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 534[Submit][Status][Discuss] ...

  3. HDU 4812 D Tree 树分治+逆元处理

    D Tree Problem Description   There is a skyscraping tree standing on the playground of Nanjing Unive ...

  4. POJ 1741 Tree 树分治

    Tree     Description Give a tree with n vertices,each edge has a length(positive integer less than 1 ...

  5. [bzoj 1468][poj 1741]Tree [点分治]

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  6. 【CF434E】Furukawa Nagisa's Tree 点分治

    [CF434E]Furukawa Nagisa's Tree 题意:一棵n个点的树,点有点权.定义$G(a,b)$表示:我们将树上从a走到b经过的点都拿出来,设这些点的点权分别为$z_0,z_1... ...

  7. POJ 1741 Tree(点分治点对<=k)

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  8. POJ 1741.Tree 树分治 树形dp 树上点对

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24258   Accepted: 8062 Description ...

  9. poj 1744 tree 树分治

    Tree Time Limit: 1000MS   Memory Limit: 30000K       Description Give a tree with n vertices,each ed ...

  10. CF1039D You Are Given a Tree 根号分治,贪心

    CF1039D You Are Given a Tree LG传送门 根号分治好题. 这题可以整体二分,但我太菜了,不会. 根号分治怎么考虑呢?先想想\(n^2\)暴力吧.对于每一个要求的\(k\), ...

随机推荐

  1. jmeter(六)关联

    话说LoadRunner有的一些功能,比如:参数化.检查点.集合点.关联,Jmeter也都有这些功能,只是功能可能稍弱一些,今天就关联来讲解一下. JMeter的关联方法有两种:后置处理器-正则表达式 ...

  2. xshell常用命令大全

    xshell常用命令大全 (1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当前目录下以字母a开头的所有文件 ls -l *. ...

  3. ajax通过新闻id获取列表

    <div class="index_main">        <div class="page_l">           <i ...

  4. (一)Spring之初了解

    1.认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AO ...

  5. Glide清除缓存

    Glide是谷歌推荐的一款加载图片的第三方框架,对内存优化更好,更省资源,他的众多好处,我就不一一描述了,有兴趣的朋友可以百度一下,介绍的还是挺详细的. 今天主要给大家介绍一下关于怎么获取Glide的 ...

  6. 网盘资源搜索的一些知识 C#

    针对互联网盘上的资源进行搜索查找.写一个网盘资源搜索的要点主要有以下几点. 1.这个网盘资源搜索的原理就是利用互联网搜索引擎的site 命令. 其次就是针对网页链接进行提取以及处理. 首先就是编写一个 ...

  7. oracle DBA笔试题

    Unix/Linux题目: 1.如何查看主机CPU.内存.IP和磁盘空间? cat /proc/cpuinfo cat /proc/meminfo ifconfig –a fdisk –l   2.你 ...

  8. sql server 2008 r2 无法定位到数据库文件目录

    像这样,选择数据库文件时, 无法定位到文件夹目录,子目录下的都不显示.明明选择的这个文件夹里还有很多子文件夹,却显示不了. 解决方法: 在此文件夹上右击,属性-安全 添加红框中的用户就可以了.

  9. mongodb用户权限管理(二)

    数据库 分配用户权限 有了创建语法,和参数说明,接下来开始实践. 注意,还有一点,账号是跟着数据库绑定的,在那个库里授权,就在那个库里验证(auth) 否则会失败 创建 账号管理授权权限 的账号 &g ...

  10. 解剖嵌入式设备开发时以SD卡启动时SD卡的存储结构(以三星exynos4412为例)

    目前面对高性能产品的嵌入式开发中,用SD卡来代替以往的JLINK显得备受大家喜欢,而且MCU厂家也对以SD卡启动的支持度越来越大,反而对JLINK不在那么重视(不过依旧保留着).一些以开发开发板的公司 ...