【点分治】【乘法逆元】hdu4812 D Tree
思路比较裸,但是要把答案存到哈希表里面,这里需要一定技巧,否则会被K=1且点权全是1的数据卡飞。预处理乘法逆元。TLE了一天。换了种点分治的姿势……
- #pragma comment(linker,"/STACK:102400000,102400000")
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- int Res;char C;
- inline int Read()
- {
- Res=0;C='*';
- while(C<'0'||C>'9')C=getchar();
- while(C>='0'&&C<='9'){Res=Res*10+(C-'0');C=getchar();}
- return Res;
- }
- #define MAXN 100001
- #define MOD 1000003
- #define INF 2147483647
- typedef long long ll;
- typedef pair<int,int> Point;
- typedef pair<ll,int> Point2;
- int n,K;
- Point ans;
- ll m,w[MAXN],inv[MOD];
- int v[MAXN<<1],first[MAXN],next[MAXN<<1],en,id[MOD];
- void AddEdge(const int &U,const int &V)
- {
- v[++en]=V;
- next[en]=first[U];
- first[U]=en;
- }
- bool centroid[MAXN];
- int size[MAXN];
- int calc_sizes(int U,int Fa)
- {
- int res=1;
- for(int i=first[U];i;i=next[i])
- if(v[i]!=Fa&&(!centroid[v[i]]))
- res+=calc_sizes(v[i],U);
- return size[U]=res;
- }
- Point calc_centroid(int U,int Fa,int nn)
- {
- Point res=make_pair(INF,-1);
- int sum=1,maxv=0;
- for(int i=first[U];i;i=next[i])
- if(v[i]!=Fa&&(!centroid[v[i]]))
- {
- res=min(res,calc_centroid(v[i],U,nn));
- maxv=max(maxv,size[v[i]]);
- sum+=size[v[i]];
- }
- maxv=max(maxv,nn-sum);
- res=min(res,make_pair(maxv,U));
- return res;
- }
- int En,last;
- Point2 dis[MAXN];
- void calc_dis(int root,int U,int Fa,ll d)
- {
- dis[En++]=make_pair(d,U);
- for(int i=first[U];i;i=next[i])
- if(v[i]!=Fa&&(!centroid[v[i]]))
- calc_dis(root,v[i],U,d*w[v[i]]%MOD);
- }
- void calc_pairs(int s)
- {
- for(int i=last;i<En;++i)
- {
- ll t=m*inv[dis[i].first*w[s]%MOD]%MOD;
- if(id[t])
- ans=min(ans,dis[i].second<id[t]?
- make_pair(dis[i].second,id[t]):
- make_pair(id[t],dis[i].second));
- }
- for(int i=last;i<En;++i)
- {
- if(id[dis[i].first]) id[dis[i].first]=min(id[dis[i].first],dis[i].second);
- else id[dis[i].first]=dis[i].second;
- }
- }
- void solve(int U)
- {
- calc_sizes(U,-1);
- int s=calc_centroid(U,-1,size[U]).second;
- centroid[s]=1;
- for(int i=first[s];i;i=next[i])
- if(!centroid[v[i]])
- solve(v[i]);
- En=0; dis[En++]=make_pair(1,s); id[1]=s;
- for(int i=first[s];i;i=next[i])
- if(!centroid[v[i]])
- {
- last=En;
- calc_dis(v[i],v[i],s,w[v[i]]);
- calc_pairs(s);
- }
- for(int i=0;i<En;++i) id[dis[i].first]=0;
- centroid[s]=0;
- }
- void init()
- {
- memset(first,0,(n+1)*sizeof(int));
- en=0; ans=make_pair(INF,INF);
- }
- int main()
- {
- inv[1]=1;
- for(int i=2;i<MOD;i++)
- {
- int a=MOD/i,b=MOD%i;
- inv[i]=(inv[b]*(-a)%MOD+MOD)%MOD;
- }
- int a,b;
- while(scanf("%d%I64d",&n,&m)!=EOF)
- {
- init();
- for(int i=1;i<=n;++i)
- {
- w[i]=(ll)Read();
- w[i]%=MOD;
- }
- for(int i=1;i<n;++i)
- {
- a=Read(); b=Read();
- AddEdge(a,b);
- AddEdge(b,a);
- }
- solve(1);
- if(ans==make_pair(INF,INF))
- puts("No solution");
- else
- printf("%d %d\n",ans.first,ans.second);
- }
- return 0;
- }
【点分治】【乘法逆元】hdu4812 D Tree的更多相关文章
- HDU4812 D tree 【点分治 + 乘法逆元】
D树 时间限制:10000/5000 MS(Java / Others)内存限制:102400/102400 K(Java / Others) 总共提交5400个已接受的提交1144 问题描述 南京理 ...
- HDU4812 D Tree(树的点分治)
题目大概说给一棵有点权的树,输出字典序最小的点对,使这两点间路径上点权的乘积模1000003的结果为k. 树的点分治搞了.因为是点权过根的两条路径的LCA会被重复统计,而注意到1000003是质数,所 ...
- Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)
题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...
- 51nod1256(乘法逆元)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...
- 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exgcd(l ...
- HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=5651 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减 ...
- Codeforces 543D Road Improvement(树形DP + 乘法逆元)
题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...
- HDU 1452 (约数和+乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...
- HDU 1576 (乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...
随机推荐
- maven pom继承与聚合
一.POM聚合模块: 在分布式架构,分模块化开发中,每个某块可能都是一个单独的maven项目,能够独立的进行项目构架,当模块比较多时,可以使用maven聚合聚合项目来简化maven构建,一次构建多个项 ...
- SpringMVC学习 -- @RequestParam , @RequestHeader , @CookieValue 的使用
使用 @RequestParam 绑定请求参数值: value:参数名 , 仅有一个 value 属性时 , value 可以省略不写. required:是否必须.默认为 true , 表示请求参数 ...
- Maven环境搭建、调试、打包
1.配置Maven环境 将下载文件解压,然后设置maven环境 新建环境变量M2_HOME 变量名:M2_HOME 变量值:F:\maven\apache-maven-3.0.3 追加path环境变量 ...
- vivo面试经验4(linux基本操作,最基本,必须得会!!)
操作linux通过xshell进行连接: 基本操作介绍 1.shutdown -h 关机 shutdown -r 重启 2.mkdir aaa 新建目录aaa rmdir aaa 删除目录aaa 3. ...
- VR行业纷纷倒闭:有硬件没内容
从去年年底开始,VR就成为了一个流行词汇,不仅是巨头公司砸钱布局,众多创业公司也纷纷投入其中.但是,一窝蜂拥入的企业基本都没有成熟的商业模式和赢利模式,只能靠融资供血.在资本寒冬中,大部分的VR企业开 ...
- 【CodeForces】841C. Leha and Function(Codeforces Round #429 (Div. 2))
[题意]定义函数F(n,k)为1~n的集合中选择k个数字,其中最小数字的期望. 给定两个数字集A,B,A中任意数字>=B中任意数字,要求重组A使得对于i=1~n,sigma(F(Ai,Bi))最 ...
- HDU 2105 The Center of Gravity (数学)
题目链接 Problem Description Everyone know the story that how Newton discovered the Universal Gravitatio ...
- passwd讲解
root:$dffjioowwf/:16274:0:999999:7::: 1用户名:密码:最近修改密码的日期:密码不能更改的天数:密码过期时间:密码需要更改期限到拉前7发出警告:宽限天数:帐号过期时 ...
- Linux设置编译器环境变量
Linux设置编译器环境变量 https://jingyan.baidu.com/article/9f7e7ec0bb22aa6f29155453.html Linux添加环境变量与GCC编译器添加I ...
- Bean装配之@Autowired注解
@Required(不常用) @Autowired(常用) 下面用例子解释以上内容: @Autowired注解的三种方式如下,第一种是直接在属性名上加注解,这样就可以不用在写set方法进行注入,这种方 ...