Educational Codeforces Round 58 (Rated for Div. 2) D.GCD Counting(树的直径+gcd)

题意

Educational Codeforces Round 58 (Rated for Div. 2) D.GCD Counting(树的直径+gcd)_第1张图片

Educational Codeforces Round 58 (Rated for Div. 2) D.GCD Counting(树的直径+gcd)_第2张图片

思路来源

Codeforce__JuRuo

题解

将每个gcd分解素因子放入对应vector

相当于对每个素因子建了一棵树

遍历每个素因子的树,寻找直径,更新答案

注意C++11的写法 好好学学 会省不少功夫

还有一些技巧性写法 加油!

代码

#include
using namespace std;
#define ll __int64
const int maxn=2e5+10;
int n,a[maxn],vis[maxn],vis1[maxn],ans=1,flag=1,md,mp,p[maxn];
struct edge
{
   int u,v;
   edge(int uu,int vv):u(uu),v(vv){
   }
};
vectore[maxn];
vector v[maxn];
void dfs(int p,int d,int *vis)
{
	if(vis[p])return;//溯父 不影响 
	vis[p]=1;
	if(d>md)md=d,mp=p;
	for(int i=0;i1&&(flag=0);//短路判均<=1 
	} 
	if(flag)
	{
		puts("0");
		return 0; 
	}
	for(int i=1;i1)
		{
		  for(int j=1;j*j<=k;++j)//j从1开始是为了判k 
		  {
		  	if(k%j==0)
		  	{
		  	if(!p[j]&&j!=1)e[j].push_back(edge(u,v));
		  	if(j*j!=k&&!p[k/j])e[k/j].push_back(edge(u,v));
		    }
		  } 
		} 
	}
	for(int i=2;i p;
			for(int j=0;j

 

你可能感兴趣的:(Educational Codeforces Round 58 (Rated for Div. 2) D.GCD Counting(树的直径+gcd))