2020牛客寒假算法基础集训营4(A:欧几里得)(规律题)

题目链接:

https://ac.nowcoder.com/acm/contest/3005/A

题面:

在这里插入图片描述
在这里插入图片描述

思路:

这道题目看似是考察欧几里得,但是实际上是一道规律题,我们可以先看题目的要求,a和b都是大于0的数字,并且a是大于b的数,根据题目中的递归公式,我们可以看出来当b=0的时候,是不需要继续一次递归的,但是首先a是要大于b的,所以当递归0次的时候应该就是gcd(1,0),那么递归一次找最小的是不是就要递归一次后得到递归零次的最小值,那么递归一次对应的就是gcd(2,1)了,接下来打表看一下。
gcd(1,0)
gcd(2,1)->gcd(1,2%1)=gcd(1,0)
gcd(3,2)->gcd(2,3%2)=gcd(2,1)

后面就基本满足这么一个规律,那么我可以得到一个规律
d[0]=1
d[1]=3
d[2]=5
d[3]=8
d[4]=13

d[n]=d[n-1]+d[n-2]
然后我们就可以实现前缀和的预处理,然后之和t次访问就直接访问数组就可以了

参考代码:

#include<bits/stdc++.h>
using namespace std;
long long dp[100];
int main()
{
    long long t;
    scanf("%lld",&t);
    dp[0]=1;
    dp[1]=3;
    dp[2]=5;
    for(int i=3;i<=81;i++)
    {
        dp[i]=dp[i-1]+dp[i-2];
    }
    while(t--)
    {
        long long a;
        scanf("%lld",&a);
        printf("%lld\n",dp[a]);
    }
}
发布了55 篇原创文章 · 获赞 12 · 访问量 8949

猜你喜欢

转载自blog.csdn.net/qq_45740533/article/details/104271096