5.15周赛题解

题目:Max

G-max

题意:

给定整数\(c,n\),选择一个数对\((a,b)\),\(1\leq a,b \leq n\),使得\(gcd(a,b)=c\),且\(a*b\)的值最大。

题解:

两个数的gcd是c,首先意味着这两个数都能被c整除,也就是a,b=x*c,x\(\in\)(1,2..n/c)。

因为要使a*b的值要最大,则可以取\(\lfloor\frac{n}{c}\rfloor\times c\)\((\lfloor\frac{n}{c}\rfloor-1)\times c\),如果\(\lfloor\frac{n}{c}\rfloor\)<1,则表示n比c小,不可能取到这个数对,输出-1,如果\(\lfloor\frac{n}{c}\rfloor\)=1,则a与b都取c时,为最佳选择。

证明:

为什么取最大的和次大的一定对呢?因为两个数同时被某一个数整除的话,他们的差一定是这个除数的倍数,而最大的数和次大的数的间隔正好只有c,所以这两个数最多只能同时整除以c,没法被比c更大的数同时整除,所以gcd不会更大,证毕。

代码:

void solve(){
    int c,n;
    cin>>c>>n;
    int ci = n/c;
    if(ci>1){
        cout<<ci*c*(ci-1)*c;
    }else if(ci==1){
        cout<<c*c;
    }else{
        cout<<-1;
    }
}
posted @ 2022-05-18 20:40  Lumennn  阅读(58)  评论(0)    收藏  举报