题意:给你一个矩形,有一个多边形,矩形的每条边上至少有一个多边形的顶点,求这个多边形的最小的面积下的多边形的顶点数和顶点坐标
题解:队友YY出来的,数学和想法题,有两种情况
第一种是三角形,这个很容易想到,然后最小的话就是(x,y)到对角线的距离最小,bx-ay的最小值是gcd(a,b),用扩展欧几里得求解,然后就可以求出答案了(虽然我也不太明白),还有就是要判断一下gcd是不是小于50000,否则是第二种情况最小
第二种情况,上面那个点是(a-1,b),右边的点是(a,b-1),中间那个点是(a/gcd,b/gcd)
代码:
#include<cstdio>
#include <cstring>
#include<bits/stdc++.h>
#define eps 1e-6
#define ls L,mid,rt<<1
#define rs mid+1,R,rt<<1|1
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
int exGcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
int r=exGcd(b,a%b,x,y);
int t=x;x=y;y=t-a/b*y;
return r;
}
int main (){
int T;
int x,y;
int a,b;
scanf ("%d",&T);
while (T--){
scanf ("%d%d",&a,&b);
int gc=exGcd(a,b,x,y);
x=abs(x);
y=abs(y);
if (gc<50000){
printf ("3\n0 0\n");
printf ("%d %d\n",y,x);
printf ("%d %d\n",a,b);
}
else {
printf ("4\n0 0\n");
printf ("%d %d\n",a-1,b);
printf ("%d %d\n",a/gc,b/gc);
printf ("%d %d\n",a,b-1);
}
}
return 0;
}