首页 > 其他分享 >牛客小白月赛60 E-寻找小竹!(数论)

牛客小白月赛60 E-寻找小竹!(数论)

时间:2022-11-12 17:35:42浏览次数:76  
标签:联通 LL 路口 优雅 60 牛客 小白月赛 primes sum

链接:https://ac.nowcoder.com/acm/contest/45670/E
来源:牛客网

题目大意:

有n个城市,n-1条道路,每个城市都有它自己的优雅值ai

而如果两个相邻的路口的优雅值存在至少两个共同的质因子,那么就说这两个相邻的路口就是共同优雅的。

共同优雅联通块定义为:在城市中选取若干个路口,若这些路口们两两互相联通,且每两个相邻的路口都是共同优雅的,则该联通块称为共同优雅联通块。

问我们最大的共同优雅联通块里面包含了多少座城市?
输入
4
12 12 4 18
1 2
1 3
2 4
输出
3
说明
最大优雅联通块为 1,2,4三个路口所在的联通块,两两相邻的路口均包含 2,3 两个质因子。

有思路但是实现不好,唔,加练!

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
LL primes[N],cnt=0;
bool st[N];
LL n,ans=0,a[N],sum[N];
//sum[i]记录当前节点i所包含的满足城市的数量
vector<LL> g[N];
//线性筛板子
void get_primes(LL n)
{
    for(LL i=2;i<=n;i++)
    {
        if(!st[i]) primes[cnt++]=i;
        for(LL j=0;primes[j]<=n/i;j++)
        {
            st[primes[j]*i]=true;
            if(i%primes[j]==0) break;
        }
    }
}
void dfs(LL u,LL fa)
{
    //每次遍历到一个点的时候,最少它就只有它自己一个点符合条件
    sum[u]=1;
    for(LL i=0;i<g[u].size();i++)
    {
        LL idx=g[u][i];
        if(idx==fa) continue;
        dfs(idx,u);

        //找到当前节点和父节点的共同最大公约数
        //这样就可以直接在gcd这个数字上寻找相同的质数因子
        LL gd=__gcd(a[u],a[idx]);
        LL num=0;
        for(LL i=0;i<cnt;i++)//在我们已经标记过的质因子上比对一下
        {
            if(gd==1) break;
            if(!st[gd])//这个质数存在,因为这就是个质数了,不可再分
            {
                num++;
                break;
            }
            if(gd%primes[i]==0)
            {
                num++;
                if(num>=2) break;
                while(gd%primes[i]==0)//约去相同质因子
                {
                    gd/=primes[i];
                }
            }
        }
        if(num>=2) sum[u]+=sum[idx];//达标:当前节点记录往下的子节点
    }
    ans=max(ans,sum[u]);
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    get_primes(5e6);//先获取数据范围内的所有质数
    while(T--)
    {
        cin>>n;
        for(LL i=1;i<=n;i++)
            cin>>a[i];
        for(LL i=1;i<n;i++)
        {
            LL x,y;
            cin>>x>>y;//建边
            g[x].push_back(y);
            g[y].push_back(x);
        }
        dfs(1,-1);//从根节点跑一跑
        cout<<ans<<endl;
    }
    return 0;
}

标签:联通,LL,路口,优雅,60,牛客,小白月赛,primes,sum
From: https://www.cnblogs.com/Vivian-0918/p/16884217.html

相关文章

  • 优解YJ460二维码扫描器添加后缀回车的方法
    第一步:扫描AddSuffix条码。 第二步:扫描AddCRSuffixAllSymbologies条码。  第三步:最后扫描Save条码。......
  • 牛客小白月赛60
    补一下题,c的状态方程都列出来了,但没想通d只剩几个样例没过没验出来,应该是连通性的问题,刚才换了个写法,都初始化成0x3f过了目录C.小竹关禁闭D游戏购买!C.......
  • 牛客小白月赛60 题解
    比赛通道:牛客小白月赛60前言第二次小白月赛没有AK,感觉自己可以原地退役了QAQ。这次F题理论上我能做出来,但是由于没有打表状态不佳,导致没有AK。A.小竹与妈妈思路这题......
  • 【题解】P2260 [清华集训2012]模积和(数学,整除分块)
    【题解】P2260[清华集训2012]模积和比较简单的一道推式子的题。(清华集训居然会出这种水题的吗)题目链接P2260[清华集训2012]模积和题意概述求\[\sum_{i=1}^{n}\sum......
  • 560.和为k的子数组
    给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。示例1:输入:nums=[1,1,1],k=2输出:2示例2:输入:nums=[1,2,3......
  • 白嫖永久服务器1668060025667
    阿贝云服务器注册免费领取1核1g内存5m宽带10g内存的云服务器,对于个人来说完全够用了。还有免费备案和虚拟主机,免备案对于搭建个人博客就很方便,部署了小项目上去,运行流畅不......
  • 白嫖永久服务器1668060067460
    阿贝云服务器注册免费领取1核1g内存5m宽带10g内存的云服务器,对于个人来说完全够用了。还有免费备案和虚拟主机,免备案对于搭建个人博客就很方便,部署了小项目上去,运行流畅不......
  • ORA-00600 内部错误代码:
    发现对某个表进行操作时突然报改错(后面在其他生产环境也发现过其他表出现同样的报错),网上说是oracle11g本身的问题,不想动生产环境解决办法:导出数据,重新建表导入数据错误消......
  • 牛客小白月赛 54
    Asum把所有的数放进一个大根堆,然后每次取出最大的两个相加,累加到答案中去,并重新放回到大根堆。最大两数之和重新放入大根堆依旧是最大的数,所以可以优化成前缀和来做。#......
  • 牛客小白月赛55
    A至至子的等差中项#include<bits/stdc++.h>usingnamespacestd;int32_tmain(){inta,b;cin>>a>>b;cout<<b*2-a<<"\n";}B至至......