题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5922
题目大意:给出一个数字n,代表一个图中的n个顶点,编号为1-n,每条边上的权值为构成该边顶点的编号的最大公约数,求这个图的一棵最小生成树,使得该树的边的权值和最小
解题思路:这道题很有意思,看似要求构造一棵最小生成树,其实因为权值都为顶点编号的最大公约数,因此从1点出发链接到其他点会使得边上的权值最小,因此无论n为多少,都应该是用1作为根,从1出发去链接其他点,这样一来,这个问题就变成了2+3+……+n的问题,用等差数列公式即可求解,不过需要注意的一点是,由于给出的数据范围非常大,在计算时需要先除以2,再做乘法(当然,要区分n为奇数和偶数的情况)
AC代码:
#include <iostream>
using namespace std;
int main()
{
long long input;
long long result;
long long temp;
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>input;
if(input%2==0)
{
temp = input+1;
input = input>>1;
}
else
{
temp = (input+1)>>1;
}
result = temp*input-1;
cout<<"Case #"<<i<<": "<<result<<endl;
}
return 0;
}