首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。