洛谷 P5560 【[Celeste-B]Golden Feather】

这可真是一道水题,但我比赛时就是没做出来

经过昨天一夜冥思苦想,我想到了一种类数学的证明方法(其实打表找规律更快 )————>>

题意

将点权为(i + 1 ) ^ 2 - 1 , i = 1 ~ n,的这n个点连通。其实这是一颗树,共有n - 1个节点,两点之间的距离是点权的最大公约数。

做法

准备
设停止的地方数为i,f(i) =(i + 1 ) ^ 2 - 1 = i ( i + 2 ) 。条件① :存在 i ( i + 2 ),i = 1 ~ n - 1 与 n * (n + 2) 互质。这样就可以保证已有的n - 1个点加上这个点后所得的数最小(加1)。

正文

1、一开始假设 2 ~ 正无穷 这些数都不满足条件 ①(没有比1更小的,故1不在)。

2、当i = n - 1时,f(n - 1) = (n - 1)(n + 1) , f(n) = n * (n + 2), n - 1以及n + 1与 n 都互质, n + 1 与 n + 2 也必定互质,所以当且仅当n - 1 和n + 2互质时, gcd(f(n - 1),f(n)) = 1。所以只有n - 1为3的倍数时(想想为什模), 两数不互质, 所以不满足条件①的数从2 ~ 正无穷变成了 4, 7, 10, 13, 16 ,19,22 ……正无穷。

3、f(n - 2) = (n - 2) * n, 与f(n)必定不互质。

4、f(n - 3) = (n - 3) * (n - 1), n - 3 与 n 一定互质(因为剩下来的都是是除以3余1的),n - 1 与 n + 2 不可能互质(如2),转5;

5、f(n - 4) = (n - 4 ) * (n - 2 ), 此时该式已超出4的范围,所以f(4)一定不满足条件①。同上可得奇数可以满足条件①。所以范围又缩小到4, 10, 16, 22 …… 正无穷。;

6、反复以上操作,最终假设我们是机器人我们能进行无数次操作,我们惊奇滴发现10以外的数字都会被排除,只有4 和 10 留在里面, 可以计算得到当n = 4 或n = 10时, 结果为5 或 11, 其余的由于都只有n - 1个节点且权值都为1,故其余答案为n - 1。

终于到了上代码的时间了QAQ

#include <cstdio>
#define ll long long

using namespace std;

ll t, n;

int main(){
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        if(n == 4) printf("5\n");
        else if(n == 10) printf("11\n");
        else printf("%lld\n",n - 1);
    }
    return 0;
} 

ps:这只是作为蒟蒻的我的理解,如果有巨佬能够运用强大的数学方法证明当然更好喽

发布了5 篇原创文章 · 获赞 6 · 访问量 156

猜你喜欢

转载自blog.csdn.net/pikabi/article/details/105293013