CF1101D GCD Counting
CF1101D GCD Counting
又被trick了
不用什么点分治
直接树形dp即可
开始的想法:
f[x][j]x为根的子树gcd至少为j(j是x的一个约数)的最长链
然后对y合并。类似于树的直径
但是复杂度还是很大的。。。
这个题的关键是:我们只关心gcd是不是1,并不关心gcd是什么!
gcd不是1,意味着一定有公共质因子!
而质因子个数非常少
可以f[x][j]表示,x为根的子树,往下走,公共质因子为j的最长链
然后甚至可以暴力合并!
显然最优解可以被处理到!
代码:
#include<bits/stdc++.h> #define reg register int #define il inline #define numb (ch^'0') using namespace std; typedef long long ll; il void rd(int &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x); } namespace Miracle{ const int N=2e5+5; vector<int>p[N],f[N]; int n; int ans; struct node{int nxt,to; }e[2*N]; int hd[N],cnt; void add(int x,int y){e[++cnt].nxt=hd[x];e[cnt].to=y;hd[x]=cnt; } void dfs(int x,int fa){for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;if(y==fa) continue;dfs(y,x);for(reg j=0;j<p[x].size();++j){// cout<<" j "<<p[x][j]<<endl;for(reg k=0;k<p[y].size();++k){// cout<<" k "<<p[y][k]<<endl;if(p[x][j]==p[y][k]){ans=max(ans,f[x][j]+f[y][k]);f[x][j]=max(f[x][j],f[y][k]+1);}}}} } void div(int x,int id){for(reg i=2;(ll)i*i<=x;++i){if(x%i==0){p[id].push_back(i);f[id].push_back(1);while(x%i==0) x/=i;}}if(x>1){p[id].push_back(x);f[id].push_back(1);} } int main(){rd(n);int x;bool flag=false;for(reg i=1;i<=n;++i){rd(x);if(x!=1) flag=true;div(x,i);}if(!flag){puts("0");return 0;}ans=1;int y;for(reg i=1;i<=n-1;++i){rd(x);rd(y);add(x,y);add(y,x);}dfs(1,0);printf("%d",ans);return 0; }} signed main(){Miracle::main();return 0; }/*Author: *Miracle*Date: 2019/1/17 19:37:47 */
总结:
其实有些时候,题目很麻烦
但是实际上可以简化条件,想想我们关心什么
转载于:https://www.cnblogs.com/Miracevin/p/10284269.html
CF1101D GCD Counting相关推荐
- CF990G GCD Counting(树上莫比乌斯反演,分层图,并查集)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给定一棵点带权无根树,对于每个 k∈[1,2×105]k\in[1,2\times10 ...
- Codeforece 990G. GCD Counting(点分治+暴力)
Codeforece 990G. GCD Counting(点分治+暴力) 题目链接:G. GCD Counting 题意: 给定一个nnn个节点的带权树,求所有点对(x,y)(x,y)(x,y)间简 ...
- GCD Counting
https://codeforces.com/contest/1101/problem/D 题解:
- 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- Educational Codeforces Round 58
D. GCD Counting 题意: 给出n个点的树,每个点有一个权值,找出一条最长的路径使得路径上所有的点的gcd>1 题解: gcd>1的一定不会有很多.所以暴力搞一下就行,不需要点 ...
- c++ hashset的用法_c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...
- 【CF套题】 Educational Codeforces Round 58
[前言] 组队CF之帮wyl上橙,我和sc打小号上紫. 结果sc成功FST两题,wyl成功skipped. 我的小号幸存了qwq. [题目] 原题地址 A.Minimum Integer 特判一下dd ...
- 【牛客 - 303B第十五届浙江大学宁波理工学院程序设计大赛(同步赛)】Fibonacci and Counting(Fib数性质,gcd辗转相除法性质)
题干: 我们这样定义斐波那契数列,F[1]=1,F[2]=1,当n>2时F[n]=F[n-1]+F[n-2]. 斐波那契数列的前10项为:1,1,2,3,5,8,13,21,34,55. 欧几里 ...
- uva11401:Triangle Counting 递推 数学
uva11401:Triangle Counting 题目读不清楚的下场就是多做两个小时...从1-n中任选3个不重复数字(不重复啊!!坑爹啊!)问能组成三角形的有多少个, 显然1~n能组成的三角形集 ...
最新文章
- 哆啦a梦简单图画python编程_[python]画哆啦A梦,Python,绘制
- Kali国内源更新sources.list
- 2.6内核的配置与编译
- 董海冰:2018风云再起 ,期待AV1、AI和AR
- Leetcode1512. 好数对的数目 抽出本质原型 利用范围条件
- windows2003管理组创建
- C#中图片单击旋转事件
- 求职互联网数据分析,如何准备行业知识?
- redis永久化存储
- contentprovider java_ContentProvider和数据库的区别
- birt插件 web_好用的国产web报表软件非它莫属,轻松搞定复杂报表
- Python机器学习入门;推荐一本Python数据分析与机器学习入门书籍-唐宇迪《跟着迪哥学 Python数据分析与机器学习实战》PDF+源代码
- 金蝶精斗云PDA移动扫码入库出库,搭配蓝牙打印机打印单据小票
- SmtpJS 几行代码实现javascript发送邮件(记录)
- 报童问题求解最大利润_OM | 选址问题模型研究——以悠桦林仓库布局实践为例...
- SpringBoot 如何执行定时任务
- 资深老狐一句感叹:白学了,猫猫究竟有什么魔力,一小时等于十年功?
- WineBottler for Mac(Mac 运行 exe 程序工具)破解版安装
- 自定义listview和ProgressBar的简单使用
- uni-app【判断手机是否安装微信QQ】
热门文章
- 经典面试题:给两个序列如何构造一棵二叉树
- LeetCode 88合并两个有序数组89格雷编码
- 策略模式(Strategy)简介
- JavaScript中Console的9个常用调试命令
- linux进程的环境变量,LINUX系统学习一(进程、MMU,环境变量、getenv、fork、getpid/ge...
- python结束循环_python中break、continue 、exit() 、pass终止循环的区别
- 带你了解2020年全新【思科专家级认证CCIE】
- 当容器应用越发广泛,我们又该如何监测容器?
- Kubernetes v1.17 版本解读 | 云原生生态周报 Vol. 31
- java cookie的有效期_Java Web cookie的有效期