C 小G的GCD

小G的GCD

https://ac.nowcoder.com/acm/contest/11169/C

小G的GCD

题目描述

小G刚学习完辗转相除法求GCD,现在他想探究一下辗转相除具体的次数。
然后写出了如下代码:

long long GCD(long long x, long long y) {
     if (!y) return 1ll;
     return GCD(y, x % y) + 1ll;
}

现在小G很好奇一个问题,他想求一下maxGCD
小G接着写出了以下代码:

long long maxGCD(long long n) {
     long long ans = 0ll;
     for (long long i = 1; i <= n; i++)
         for (long long j = 1; j <= n; j++)
             ans = max(ans, GCD(i, j));
     return ans;
 }

但是这个代码太慢了,小G会给出一个,希望你帮他快速求出答案。


这道题正解在考试的时候没有写出来,但是找找规律就可以过了。

我们写一个这样的代码:

#include <bits/stdc++.h>
using namespace std;
#define MAXN 105
long long fib[MAXN];
long long GCD(long long x, long long y) {
     if (!y) return 1ll;
     return GCD(y, x % y) + 1ll;
}
long long maxGCD(long long n) {
     long long ans = 0ll;
     for (long long i = 1; i <= n; i++)
         for (long long j = 1; j <= n; j++)
             ans = max(ans, GCD(i, j));
     return ans;
 }
int main()
{
    long long n;
    while(cin >> n)
        cout << maxGCD(n) << " ";
    return 0;
}

输入:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

然后我们会发现输出的是:

2 3 4 4 5 5 5 6 6 6 6 6 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11

我们会发现:

答案什么数:2  3  4  5  6  7  8  9  10
出现了几次: 1  1  2  3  5  8  11 19 30

!!!
这……这不就是斐波那契数列吗?
于是我们再来看范围内的斐波那契数有多少个:

#include <bits/stdc++.h>
using namespace std;
#define MAXN 105
long long fib[MAXN];
long long GCD(long long x, long long y) {
     if (!y) return 1ll;
     return GCD(y, x % y) + 1ll;
}
long long maxGCD(long long n) {
     long long ans = 0ll;
     for (long long i = 1; i <= n; i++)
         for (long long j = 1; j <= n; j++)
             ans = max(ans, GCD(i, j));
     return ans;
 }
int main()
{
    long long x = 1, y = 1, z, tot = 1, i = 0;
    while(tot < 1000000000000000000)
    {
        i++;
        tot += x + y;
        z = x + y;
        x = y;
        y = z;
    }
    printf("%lld %lld\n", i, tot);
    return 0;
}

我们发现在前80个斐波那契数的和轻轻松松就可以超过,所以我们的程序就写得出来了:

#include <bits/stdc++.h>
using namespace std;
#define MAXN 105
long long fib[MAXN];
long long GCD(long long x, long long y) {
     if (!y) return 1ll;
     return GCD(y, x % y) + 1ll;
}
long long maxGCD(long long n) {
     long long ans = 0ll;
     for (long long i = 1; i <= n; i++)
         for (long long j = 1; j <= n; j++)
             ans = max(ans, GCD(i, j));
     return ans;
 }
int main()
{
    long long n;
    cin >> n;
    int ans = 0;
    fib[0] = 1;
    fib[1] = 1;
    for(int i = 2; i <= 76; i++)
        fib[i] = fib[i - 1] + fib[i - 2];
    ans = 2;
    for(int i = 0; i <= 76; i++)
    {
        if(n > fib[i])
        {
            n -= fib[i];
            ans++;
        }
        else
        {
            printf("%d\n", ans);
            return 0;
        }
    }
    return 0;
}

都看到这儿了,就点个赞吧~

(牛币+10086001)

全部评论
只是加法写错了
点赞 回复 分享
发布于 2021-04-09 17:57
但是8不是出现了13次吗
点赞 回复 分享
发布于 2021-03-27 19:19

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
24
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务