5.15周赛题解
题目: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;
}
}

浙公网安备 33010602011771号