题目链接
将这张表看做一个坐标系,观察可得n的编号即n的坐标。设n(x,y),则横纵坐标的和为x+y。通过观察发现和为a的斜线上有a-1个点,于是n点之前的斜线共有(1+2+..+x+y-2)=(x+y-2)*(x+y-1)/2个点;
而由对称性n点与前一斜线的差值可直接等于x(或y)所以问题变成找到一组x,y,使得n=(x+y-2)*(x+y-1)/2+x;
移项可得2*n=(x+y-2)*(x+y-1)+x;
我们可以知道2*n不超过5000的平方,所以可以直接枚举,时间复杂度可以保证。
代码就很简单了。
(后来发现这段代码有问题,但是AC了……可能是数据的问题吧)
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n,x,y;
scanf("%d",&n);
if(n&1)
{
for(x=1;x<=5000;x++)
for(y=1;y<=5000;y++)
if(2*n==(x+y-2)*(x+y-1)+2*x)
{
if(x>y)swap(x,y);
printf("%d/%d\n",x,y);
return 0;
}
}
else
{
for(x=1;x<=5000;x++)
for(y=1;y<=5000;y++)
if(2*n==(x+y-2)*(x+y-1)+2*x)
{
if(x>y)swap(x,y);
printf("%d/%d\n",x,y);
return 0;
}
}
}