xtu—1298(二分法)
今天总算开始明白递归到底怎么用,然后做这个题的时候正常打表超时了,就试着用二分去做,没想到做出来了,very happy ^_^,
其实我之前还不会用也没用过二分
Position题目描述将1 开始的自然数按三角形排列,请问n 在第几行第几列?1247⋯ 358 69 10 输入存在不超过10000 组样例,每行输入一个整数n(1≤n≤10 9 ) 。 输出每行输出一个样例的结果,为两个整数,分别表示行数和列数,中间用一个空格隔开,计数从1开始。 样例输入1 10 100 1000000000 样例输出1 1 4 4 14 9 44721 38440 |
#include<stdio.h>
#define _int __int64
int main()
{
_int a[80000]={'\0'};
for(_int i=1;(i*i-i)/2+1<=1000000000;i++)
{
a[i]=(i*i-i)/2+1;
}
_int n;
while(scanf("%I64d",&n)!=EOF)
{
getchar();
_int m=0,i=1,j=22000,k=44722;
while(k-i>1)
{
if(n==a[i])
{
m=i;
break;
}
if(n==a[j])
{
m=j;
break;
}
if(n==a[k])
{
m=k;
break;
}
//
if(n>a[j])
{
i=j;
j=(j+k)/2;
}
else
{
k=j;
j=(i+j)/2;
}
//printf("a[%I64d]=%I64d a[%I64d]=%I64d a[%I64d]=%I64d n=%I64d\n",i,a[i],j,a[j],k,a[k],n);
if(n==a[i])
{
m=i;
break;
}
if(n==a[j])
{
m=j;
break;
}
if(n==a[k])
{
m=k;
break;
}
}
if(m==i||m==j||m==k)
{
;
}
else m=i;
printf("%I64d %I64d\n",m,n-(m*m-m)/2);
}
return 0;
}