luogu P5560 [Celeste-B]Golden Feather

题目大意

n n n 个点的完全无向图,边 ( i , j ) (i,j) (i,j) 的权是 gcd ⁡ ( a i , a j ) \gcd (a_i,a_j) gcd(ai,aj),其中 a x = x ( x + 2 ) a_x=x(x+2) ax=x(x+2)。求最小生成树的边权之和。

解题思路

数学题。看样例直接交一发 n − 1 n-1 n1,WA。

打表。发现 n = 4 n=4 n=4 的时候是5, n = 10 n=10 n=10 的时候是11。然后剩下的貌似就是 n − 1 n-1 n1 了,过了。

#include 
#include 
#include 

typedef long long ll;

ll a;
int main (){
	int T;
	scanf ("%d", &T);
	while (T--){
		scanf ("%lld", &a);
		if (4==a||10==a) printf ("%lld\n", a+1);
		else printf ("%lld\n", a-1);
	}
}

考虑证明这个结论。

n n n 变大1的时候,即加入一个新的点 n n n,我们不难想到在原来的最小生成树上加一条边。这条边要么是1,要么不是1。

如果找到一个点跟这个点互素,那么就是1;否则,如果所有的点都不跟这个点互素,那么就不是1。是什么呢,注意到1号点跟他不互素,所以是3。

怎么判断所有的点都不跟这个点互素。首先得是偶数。其次还得被3整除。观察 n ( n + 2 ) m o d    6 n(n+2)\mod6 n(n+2)mod6,显然只有0,4满足要求。

观察前面 n − 1 n-1 n1 个点 m o d    6 \mod6 mod6。偶数的情况显然满足。奇数的情况有三种, 1 × 3 , 3 × 5 , 5 × 1 1×3,3×5,5×1 1×3,3×5,5×1。带3的情况显然满足,剩下最后一种情况。

最后一种情况下,不会了。打表找规律吧。

你可能感兴趣的:(信息学,模拟,信息学,数学,c语言,c++,算法)