首页 > 代码库 > BJFU 1015

BJFU 1015

描述

 

数字具有神奇的魔力,神奇到ben想把所有数字全部保存起来。于是他设想了如下的保存方法。假设有一张无限大的纸板,将所有自然数(不包括0)按如下顺序排列书写在纸板上保存:
1 2 6 7  15  16 ...
3 5 8  14  17 ...
4 9  13  ...
10 12  ...
11  ...
...

在这样的排列下,3排列在第2行第1列,13排在第3行第3列。现在ben想知道,对任意自然数,它排列在第几行第几列?

 

输入

 

输入包含多组测试数据,每组测试数据占一行,为一个自然数N(64位整数范围内。)

 

输出

 

对每组输入的自然数,请输出(i,j),表示该自然数排列在第i行第j列。

 

样例输入

3
13
1993
9223372036854775807

样例输出

(2,1)
(3,3)
(24,40)
(2147483647,2147483650)


看到这一题我一开始的思路是这样的↓
 1 #include <stdio.h>
 2 int main()
 3 {
 4     long long n,m;
 5     while(scanf("%lld",&n)!=EOF)
 6     {
 7         for(m=1;(m*(m+1))/2<n;m++);
 8         if(m&1)printf("(%lld,%lld)\n",1+(m*(m+1))/2-n,m-((m*(m+1))/2-n));
 9         else printf("(%lld,%lld)\n",m-((m*(m+1))/2-n),1+(m*(m+1))/2-n);
10     }
11     return 0;
12 }

果然超时

后来尝试着搜了一下。。。并没有搜到

然后虽然我的思路是改变m的取值,但却改成了这样↓

#include <stdio.h>
int main()
{
    long long n,m,j;
    while(scanf("%lld",&n)!=EOF)
    {
        for(m=0,j=0;m<n;m+=++j);
        if(m&1)printf("(%lld,%lld)\n",1+m-n,j-(m-n));
        else printf("(%lld,%lld)\n",j-(m-n),1+(m-n));
    }
    return 0;
}

依旧超时

还是考虑如何使得m的取值更合适比较好

#include <stdio.h>
int main()
{
    long long n,m;
    while(scanf("%lld",&n)!=EOF)
    {
        for(m=n/2;(m*(m+1))/2>=n;m--);
        m+=1;
        if(m&1)printf("(%lld,%lld)\n",1+(m*(m+1))/2-n,m-((m*(m+1))/2-n));
        else printf("(%lld,%lld)\n",m-((m*(m+1))/2-n),1+(m*(m+1))/2-n);
    }
    return 0;
}

依旧超时

所以我打算用暴力解法了

 

BJFU 1015