题解 [LuoguP5560][Celeste-B]Golden Feather

link

一句话题意:一个有 n n n 个节点的图,第 i i i 个节点的权值 v i = ( i + 1 ) 2 v_i=(i+1)^2 vi=(i+1)2,边 i , j i,j i,j 的权值是 g c d ( v i , v j ) gcd(v_i,v_j) gcd(vi,vj),求该图最小边权生成树。

首先,若 v i , v j v_i,v_j vi,vj 互质,肯定优先连上 i , j i,j i,j。那么接下来要考虑的,就是 是否存在 i i i,使得 v i v_i vi v j ( 1 ≤ j < i ) v_j(1\leq j< i) vj(1j<i) 不互质

注意到 ( i + 1 ) 2 − 1 = i ∗ ( i + 2 ) (i+1)^2-1=i*(i+2) (i+1)21=i(i+2),我们可以把每个节点的值用 i ∗ ( i + 2 ) i*(i+2) i(i+2) 表示:

1 ∗ 3 2 ∗ 4 3 ∗ 5 4 ∗ 6 5 ∗ 7 6 ∗ 8 7 ∗ 9 8 ∗ 10 9 ∗ 11 10 ∗ 12 11 ∗ 13 12 ∗ 14 13 ∗ 15 14 ∗ 16 15 ∗ 17 16 ∗ 18 17 ∗ 19 18 ∗ 20 \begin{matrix} 1*3&2*4&3*5\\ 4*6&5*7&6*8\\ 7*9&8*10&9*11\\ 10*12&11*13&12*14\\ 13*15&14*16&15*17\\ 16*18&17*19&18*20 \end{matrix} 13467910121315161824578101113141617193568911121415171820

可以发现第三列的数和第二列互质,第二列的数和第一列互质,第一列的奇数和 2 ∗ 4 2*4 24 互质。所以只用考虑第一列的偶数( 4 ∗ 6 , 10 ∗ 12 , 16 ∗ 18... 4*6,10*12,16*18... 46,1012,1618...)。

只有 4 ∗ 6 , 10 ∗ 12 4*6,10*12 46,1012 例外qwq,但是不会证。

#include <bits/stdc++.h>
using namespace std;

int main(){
	int t; scanf("%d", &t);
	while(t--){
		long long n; scanf("%lld", &n);
		if(n == 4) puts("5");
		else if(n == 10) puts("11");
		else printf("%lld\n", n-1);
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值