cfGlobalRound24--BC補題

osir發表於2024-04-06

B-Doremy's Perfect Math Class

思路:假設答案集合,在普遍的答案集合中找到特別之處.

!!假設!!a1,a2,a3,a4就是某個集合S的答案。

a2-a1=a1,即a2=2*a1.

必然的..因為a2-a1<a2,結果又存在於S中,結果只能是a1.

a3-a2=a1 or a2 ?

假如a3-a2=a2,則a3=2*a2=4*a1.那麼a3-a1=3*a1..又3*a1>a2, 3*a1<a3..意味著a2,a3之間還有不存在的數。這是和一開始的假設矛盾的

所以a3-a2=a1,才是合法的.

a4-a3=a1 or a2 or a3 ?

if--a4-a3=a3,則a4=2*a3=6*a1.那麼a4-a1=5*a1..又5*a1>a3, 5*a1<a4..意味著a3,a4之間還有不存在的數。這是和一開始的假設矛盾的

if--a4-a3=a2,則a4=5*a1.那麼a4-a1=4*a1..又4*a1>a3,4*a1<a4..還是意味著a3,a4,之間還有不存在的數字。這是和一開始的假設矛盾的

那麼a4-a3=a1.才是合法的。那麼可以發現兩個相鄰的數字的差值是一定的,是最小的數字a1..意味著答案是一個等差數列

因為是一個等差數列,設公差為d,那麼d=a1,且更大的數必然都是a1的倍數.所以答案即是maxn/a1; 但是a1不一定是輸入的最小值.

如果單純記錄陣列之間的最小差值,或集合本身最小值是不行的:{3,5,7,9}-->{1,2,3,4,5,6,7,8,9}; 5-3=2,3-2=1輾轉相減,出現了1.----在求gcd的時候,5%3=2,3%2=1--->5-3-2=1;

9%5=4,5%4=1--->9-5-4=1;

{5,25}-->{5,10,15,20,25}

cfGlobalRound24--BC補題

cfGlobalRound24--BC補題

int gcd(int a,int b){
    if(b==0) return a;
    return gcd(b,a%b);
}
void solve(){       //補B--數學思維
    //偏門:觀察樣例
    //cout<<__gcd(24,12);
    int n,_gcd=0; cin>>n;
    int maxn=INT_MIN;
    for(int i=1;i<=n;i++){
        int x; cin>>x;
        maxn=max(maxn,x);
        _gcd=gcd(_gcd,x);
    }
    cout<<maxn/_gcd<<endl;
}