Codeforces Pride(數論)

在這裏插入圖片描述
題目大意:
給你n個數,讓你進行操作,操作是對兩個數取他們的gcd,這個gcd可以將這兩個數其中一個替換掉,問將所有的數字變爲1最少需要多少次操作

解題思路:
我們應該找能gcd得出1的最小區間,得出他們的距離,這個距離就是將這個小區間變出一個1所需要的步數,只要能得出一個1,再需要n-1步就可以將整個區間變爲1了

代碼:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,arr[2020],cnt=0;
int gcd(int a,int b)
{
    if(a<b)
    {
        int temp=a;
        a=b;
        b=temp;
    }
    while(b)
    {
        int temp=a%b;
        a=b;
        b=temp;
    }
    return a;
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &arr[i]);
        if (arr[i] == 1) cnt++;
    }
    if (cnt) {
        printf("%d", n - cnt);
        return 0;
    }
    int m = 0x3f3f3f3f;
    for (int i = 1; i < n; ++i)
    {
        int g=arr[i];
        for(int j=i+1;j<=n;++j)
        {
            g=gcd(g,arr[j]);
            if(g==1)
            {
                m=min(m,j-i+n-1);
                break;
            }
        }
    }
    if(m==0x3f3f3f3f) puts("-1");
    else printf("%d",m);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章