GCD Counting-树形DP

GCD Counting

思路: 预处理  每个权值的素因子。问题转化为  以同一个素数作为因子 最长的链,

树形DP求解,ans 由 此点的 最长子链 + 次长子链 相加得到, 然后再更新最长子链

#include
using namespace std;
#define maxn 234567
int pri[maxn+10],n,a[maxn+10];
int x,y,dp[maxn+10][30],id,ans;
int head[maxn+10],cnt,sum[maxn];
vectorp[maxn+10];
bool isprime[maxn+10],flag;
struct node
{
    int v,to;
} edge[maxn*2];
void add(int u,int v)
{
    edge[++cnt].v=v;
    edge[cnt].to=head[u];
    head[u]=cnt;
}
void prime()
{
    isprime[0]=isprime[1]=1;
    for(int i=2; i<=sqrt(maxn); i++)
        for(int j=i*i; j

  

转载于:https://www.cnblogs.com/SDUTNING/p/10270962.html

你可能感兴趣的:(GCD Counting-树形DP)