LOJ1008 Fibsieve's Fantabulous Birthday 数学
题面
https://vjudge.net/problem/LightOJ-1008
分析
简单的数学题。
首先能推出一个规律:行数为奇数/偶数时,横纵坐标的变化顺序是一致的,比如行数为奇数时,纵坐标的取值是[1],[5 6 7],[17 18 19 20 21]...,横坐标的取值是[1],[9 8 7],[25 24 23 22 21]...。
剩下的部分一个个考虑:
①怎么判断数\(x\)在第几行:
设\(x\)在第\(t\)行,第\(t-1\)行表示为\(t_2\)行。
容易发现,边长为\(t\)的矩阵的最大值为\(t^2\)。故边长为\(t\)矩阵的最外层的数范围为\([t_2^2+1,t^2]\)(如\(t=5\)时,最外层就是\([17,25]\))。
那么\(x\)一定满足\(\sqrt x \leq t\),即:
\(t=\texttt{(取上整)} sqrt(x),t2=\texttt{(取下整)} sqrt(x)\)
②怎么判断数\(x\)在右侧还是上侧:
很显然,\(x\)只需要与\((t,t)\)的对角线元素相比即可。
设对角线上坐标为\((t,t)\)的值为\(w\)。容易发现\({w}\)的差分数列是个首项为\(2,p=2\)的等比数列。
易推出\(w(t)=t(t-1)+1|t>2\)。
显然,当\(t\)为奇数时:
-
若\(x<w(t)\),则\(x=t,y=s^2-(t2^2+1)+1=s-t2^2\)
-
若\(x=w(t)\),则\(x=t,y=t\)
-
若\(x>w(t)\),则\(x=t^2-s+1,y=t\)
当\(t\)为偶数时:
-
若\(x<w(t)\),则\(x=s-t2^2,y=t\)
-
若\(x=w(t)\),则\(x=t,y=t\)。
-
若\(x>w(t)\),则\(x=t,y=t^2-s+1\)
可以发现,奇偶行的横纵坐标其实只是颠倒了过来,完全不用独立分析。
Code
void solve(int T, LL s) {
if (s == 1) {
printf("Case %d: 1 1\n", T);
return;
}
LL x = 0, y = 0;
LL t = (LL) ceil(sqrt(s)), t2 = (LL) floor(sqrt(s));
LL num = t * (t - 1) + 1;
if (t & 1LL) {
if (s < num) x = t, y = s - t2 * t2 * 1LL;
else if (s == num) x = t, y = t;
else x = t * t * 1LL - s + 1, y = t;
} else {
if (s < num) x = s - t2 * t2 * 1LL, y = t;
else if (s == num) x = t, y = t;
else x = t, y = t * t * 1LL - s + 1;
}
printf("Case %d: %lld %lld\n", T, x, y);
}

浙公网安备 33010602011771号