题目大意
有 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 n−1,WA。
打表。发现 n = 4 n=4 n=4 的时候是5, n = 10 n=10 n=10 的时候是11。然后剩下的貌似就是 n − 1 n-1 n−1 了,过了。
#include <cstdio>
#include <cstdlib>
#include <cstring>
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 n−1 个点 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的情况显然满足,剩下最后一种情况。
最后一种情况下,不会了。打表找规律吧。