码迷,mamicode.com
首页 > 其他好文 > 详细

A - Infinite Sequence

时间:2018-05-30 13:53:53      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:ini   TE   mil   lin   print   color   简单   cin   element   

Problem description

Consider the infinite sequence of integers: 1,?1,?2,?1,?2,?3,?1,?2,?3,?4,?1,?2,?3,?4,?5.... The sequence is built in the following way: at first the number 1 is written out, then the numbers from 1 to 2, then the numbers from 1 to 3, then the numbers from 1to 4 and so on. Note that the sequence contains numbers, not digits. For example number 10 first appears in the sequence in position 55 (the elements are numerated from one).

Find the number on the n-th position of the sequence.

Input

The only line contains integer n (1?≤?n?≤?1014) — the position of the number to find.

Note that the given number is too large, so you should use 64-bit integer type to store it. In C++ you can use the long long integer type and in Java you can use longinteger type.

Output

Print the element in the n-th position of the sequence (the elements are numerated from one).

Examples

Input
3
Output
2
Input
5
Output
2
Input
10
Output
4
Input
55
Output
10
Input
56
Output
1
解题思路:简单推导:假设k表示为第k个序列(1,...,k),则前k个序列一共有n=(k+1)*k/2个数,所以求第n个数所在序列为第floor(√(2*n+0.25)-0.5)(下取整)个。因为n必须刚好为前k个序列数字的总个数时,k才会是精确的第k个序列,这时只需判断m=(k+1)*k/2是否大于n,如果n大于m,说明第n个数实际在第k+1个序列里面,则这个数为n-m;否则第n个数就在第k个序列里面,则这个数为k-(m-n)=k+n-m。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     long long n,k,m;
 5     cin>>n;
 6     k=sqrt(2.0*n+0.25)-0.5;
 7     m=k*(k+1)/2;
 8     if(n>m)cout<<n-m<<endl;
 9     else cout<<k+n-m<<endl;
10     return 0;
11 }

A - Infinite Sequence

标签:ini   TE   mil   lin   print   color   简单   cin   element   

原文地址:https://www.cnblogs.com/acgoto/p/9110405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!