D. GCD Counting 树形dp

题意:一棵树,每个节点有权值,找一条gcd不唯一的最长路,输出长度。

思路:gcd不唯1,即两个数有相同的素因子,dp[i][j]就表示以i个节点通过这个数的第j个素因子最长的子链,然后路的长度就是在遍历的时候选两个最长的相加,dfs遍历一遍树不断更新答案。

#include

using namespace std;

int dp[200005][30];
bool isprime[200005];
int n,s,e,x,ans;
struct code
{
    int to,nx;
} edge[500005];
int head[200005];
int daptop=0;
void add(int s,int e)
{
    edge[daptop].to=e;
    edge[daptop].nx=head[s];
    head[s]=daptop++;
    edge[daptop].to=s;
    edge[daptop].nx=head[e];
    head[e]=daptop++;
}
int prime[200005],top,nub[200005][32];
void check()
{
    for(int i=2; i<200005; i++)
    {
        if(isprime[i]==0)
            prime[top++]=i;
        for(int j=0; j

 

你可能感兴趣的:(dp)