Cactus Exploration
很久以前,whalyzh同学去沙漠旅行,看到了很多很多的仙人掌,
但是现在whalyzh同学已经想不起来最酷炫的那棵仙人掌长什么样了,只记得一些特征。
小Q同学根据whalyzh同学的描述,发现这棵仙人掌可以画成一个无向的连通图,这个图不存在自环,且任意一条边至多属于一个简单环。所谓简单环,是指在图中任取一个顶点作为起点,沿着不重复的边、经过不重复的点再次走到起点的闭合路径。定义一棵仙人掌的酷炫程度为这棵仙人掌对应的图中简单环的长度最大值乘以简单环的长度最小值,如果没有环,则酷炫程度为0。
现在whalyzh同学还记得这棵仙人掌的顶点数和边数,你需要求出所有满足条件的仙人掌中酷炫程度的最大值。
Input
第一行是一个正整数,表示测试数据的组数,
每组测试数据只有一行,包含两个整数,表示仙人掌的顶点数和边数。
Output
对于每组测试数据,输出一个整数,表示仙人掌的酷炫程度的最大值,如果不存在满足条件的仙人掌,请输出-1。
Sample Input
4 2 0 2 1 2 2 2 3
Sample Output
-1 0 4 -1
Hint
对于第二组样例,满足条件的仙人掌只有一种,且无环,故酷炫程度的最大值为0。
对于第三组样例,满足条件的仙人掌只有一种,且只有一个长为2的简单环,故酷炫程度的最大值为4。
题解:首先m<n-1时 图不联通 -1
其次 m>2*n-2时 图肯定不符合仙人掌的性质 -1
所以当k==n-1时 刚好构成树 0
当k==n时 构成一个环 n*n
其他情况
相当于有k=m-n+1个数 和为m
num1<=num2<=num3<=...<=numk
那么求num1*numk的最大值
显然num1==num2==num3==...numk-1时最优
这就是而开口向下的二次函数
当min=m/(2*k-2)时最优
但有可能会出现最优解是小数的情况
那么我们向上取整再向下取整即可
当min==1时 这种情况肯定不可能 ans=0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,m,k;
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&n,&m);
if(m<n-1||m>2*(n-1)){
printf("-1\n");
continue;
}
k=m-n;
if(k==-1)printf("0\n");
else if(k==0)printf("%lld\n",n*n);
else{
k++;
ll mix=m/(2*k-2);
ll mis=m-(k-1)*mix;
ll ans1,ans2;
if(mix==1)ans1=0;
else ans1=mix*mis;
ans2=(mix+1)*(m-(k-1)*(mix+1));
printf("%lld\n",max(ans1,ans2));
}
}
return 0;
}