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);
}
posted @ 2023-01-13 13:48  SxtoxA  阅读(18)  评论(0)    收藏  举报
12 13