思路比较裸,但是要把答案存到哈希表里面,这里需要一定技巧,否则会被K=1且点权全是1的数据卡飞。预处理乘法逆元。TLE了一天。换了种点分治的姿势……

  1. #pragma comment(linker,"/STACK:102400000,102400000")
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. int Res;char C;
  7. inline int Read()
  8. {
  9. Res=0;C='*';
  10. while(C<'0'||C>'9')C=getchar();
  11. while(C>='0'&&C<='9'){Res=Res*10+(C-'0');C=getchar();}
  12. return Res;
  13. }
  14. #define MAXN 100001
  15. #define MOD 1000003
  16. #define INF 2147483647
  17. typedef long long ll;
  18. typedef pair<int,int> Point;
  19. typedef pair<ll,int> Point2;
  20. int n,K;
  21. Point ans;
  22. ll m,w[MAXN],inv[MOD];
  23. int v[MAXN<<1],first[MAXN],next[MAXN<<1],en,id[MOD];
  24. void AddEdge(const int &U,const int &V)
  25. {
  26. v[++en]=V;
  27. next[en]=first[U];
  28. first[U]=en;
  29. }
  30. bool centroid[MAXN];
  31. int size[MAXN];
  32. int calc_sizes(int U,int Fa)
  33. {
  34. int res=1;
  35. for(int i=first[U];i;i=next[i])
  36. if(v[i]!=Fa&&(!centroid[v[i]]))
  37. res+=calc_sizes(v[i],U);
  38. return size[U]=res;
  39. }
  40. Point calc_centroid(int U,int Fa,int nn)
  41. {
  42. Point res=make_pair(INF,-1);
  43. int sum=1,maxv=0;
  44. for(int i=first[U];i;i=next[i])
  45. if(v[i]!=Fa&&(!centroid[v[i]]))
  46. {
  47. res=min(res,calc_centroid(v[i],U,nn));
  48. maxv=max(maxv,size[v[i]]);
  49. sum+=size[v[i]];
  50. }
  51. maxv=max(maxv,nn-sum);
  52. res=min(res,make_pair(maxv,U));
  53. return res;
  54. }
  55. int En,last;
  56. Point2 dis[MAXN];
  57. void calc_dis(int root,int U,int Fa,ll d)
  58. {
  59. dis[En++]=make_pair(d,U);
  60. for(int i=first[U];i;i=next[i])
  61. if(v[i]!=Fa&&(!centroid[v[i]]))
  62. calc_dis(root,v[i],U,d*w[v[i]]%MOD);
  63. }
  64. void calc_pairs(int s)
  65. {
  66. for(int i=last;i<En;++i)
  67. {
  68. ll t=m*inv[dis[i].first*w[s]%MOD]%MOD;
  69. if(id[t])
  70. ans=min(ans,dis[i].second<id[t]?
  71. make_pair(dis[i].second,id[t]):
  72. make_pair(id[t],dis[i].second));
  73. }
  74. for(int i=last;i<En;++i)
  75. {
  76. if(id[dis[i].first]) id[dis[i].first]=min(id[dis[i].first],dis[i].second);
  77. else id[dis[i].first]=dis[i].second;
  78. }
  79. }
  80. void solve(int U)
  81. {
  82. calc_sizes(U,-1);
  83. int s=calc_centroid(U,-1,size[U]).second;
  84. centroid[s]=1;
  85. for(int i=first[s];i;i=next[i])
  86. if(!centroid[v[i]])
  87. solve(v[i]);
  88. En=0; dis[En++]=make_pair(1,s); id[1]=s;
  89. for(int i=first[s];i;i=next[i])
  90. if(!centroid[v[i]])
  91. {
  92. last=En;
  93. calc_dis(v[i],v[i],s,w[v[i]]);
  94. calc_pairs(s);
  95. }
  96. for(int i=0;i<En;++i) id[dis[i].first]=0;
  97. centroid[s]=0;
  98. }
  99. void init()
  100. {
  101. memset(first,0,(n+1)*sizeof(int));
  102. en=0; ans=make_pair(INF,INF);
  103. }
  104. int main()
  105. {
  106. inv[1]=1;
  107. for(int i=2;i<MOD;i++)
  108. {
  109. int a=MOD/i,b=MOD%i;
  110. inv[i]=(inv[b]*(-a)%MOD+MOD)%MOD;
  111. }
  112. int a,b;
  113. while(scanf("%d%I64d",&n,&m)!=EOF)
  114. {
  115. init();
  116. for(int i=1;i<=n;++i)
  117. {
  118. w[i]=(ll)Read();
  119. w[i]%=MOD;
  120. }
  121. for(int i=1;i<n;++i)
  122. {
  123. a=Read(); b=Read();
  124. AddEdge(a,b);
  125. AddEdge(b,a);
  126. }
  127. solve(1);
  128. if(ans==make_pair(INF,INF))
  129. puts("No solution");
  130. else
  131. printf("%d %d\n",ans.first,ans.second);
  132. }
  133. return 0;
  134. }

【点分治】【乘法逆元】hdu4812 D Tree的更多相关文章

  1. HDU4812 D tree 【点分治 + 乘法逆元】

    D树 时间限制:10000/5000 MS(Java / Others)内存限制:102400/102400 K(Java / Others) 总共提交5400个已接受的提交1144 问题描述 南京理 ...

  2. HDU4812 D Tree(树的点分治)

    题目大概说给一棵有点权的树,输出字典序最小的点对,使这两点间路径上点权的乘积模1000003的结果为k. 树的点分治搞了.因为是点权过根的两条路径的LCA会被重复统计,而注意到1000003是质数,所 ...

  3. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  4. 51nod1256(乘法逆元)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...

  5. 【板子】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 ...

  6. HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)

    原题: http://acm.hdu.edu.cn/showproblem.php?pid=5651 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减 ...

  7. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  8. HDU 1452 (约数和+乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...

  9. HDU 1576 (乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...

随机推荐

  1. maven pom继承与聚合

    一.POM聚合模块: 在分布式架构,分模块化开发中,每个某块可能都是一个单独的maven项目,能够独立的进行项目构架,当模块比较多时,可以使用maven聚合聚合项目来简化maven构建,一次构建多个项 ...

  2. SpringMVC学习 -- @RequestParam , @RequestHeader , @CookieValue 的使用

    使用 @RequestParam 绑定请求参数值: value:参数名 , 仅有一个 value 属性时 , value 可以省略不写. required:是否必须.默认为 true , 表示请求参数 ...

  3. Maven环境搭建、调试、打包

    1.配置Maven环境 将下载文件解压,然后设置maven环境 新建环境变量M2_HOME 变量名:M2_HOME 变量值:F:\maven\apache-maven-3.0.3 追加path环境变量 ...

  4. vivo面试经验4(linux基本操作,最基本,必须得会!!)

    操作linux通过xshell进行连接: 基本操作介绍 1.shutdown -h 关机 shutdown -r 重启 2.mkdir aaa 新建目录aaa rmdir aaa 删除目录aaa 3. ...

  5. VR行业纷纷倒闭:有硬件没内容

    从去年年底开始,VR就成为了一个流行词汇,不仅是巨头公司砸钱布局,众多创业公司也纷纷投入其中.但是,一窝蜂拥入的企业基本都没有成熟的商业模式和赢利模式,只能靠融资供血.在资本寒冬中,大部分的VR企业开 ...

  6. 【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))最 ...

  7. HDU 2105 The Center of Gravity (数学)

    题目链接 Problem Description Everyone know the story that how Newton discovered the Universal Gravitatio ...

  8. passwd讲解

    root:$dffjioowwf/:16274:0:999999:7::: 1用户名:密码:最近修改密码的日期:密码不能更改的天数:密码过期时间:密码需要更改期限到拉前7发出警告:宽限天数:帐号过期时 ...

  9. Linux设置编译器环境变量

    Linux设置编译器环境变量 https://jingyan.baidu.com/article/9f7e7ec0bb22aa6f29155453.html Linux添加环境变量与GCC编译器添加I ...

  10. Bean装配之@Autowired注解

    @Required(不常用) @Autowired(常用) 下面用例子解释以上内容: @Autowired注解的三种方式如下,第一种是直接在属性名上加注解,这样就可以不用在写set方法进行注入,这种方 ...