題目鏈接:
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]);
}
}