Submission #430202


Source Code Expand

#include <iostream>
#include <vector>

using namespace std;

//获取小于等于某个和n 的点集数目
long long getSum(long long n)
{
	return (1 + n)*n * 2 + 1;
}
//根据给定 pos 求得所在点的坐标,由于给定数据范围大于 int,所以使用 long long
pair<long long, long long> getPair(long long pos)
{
	if (pos == 1) return pair<long long, long long>(0, 0);
	//求得一个略大于和的 n
	long long n = static_cast<long long>(sqrt(static_cast<double>(pos - 1.0) / 2.0)) + 1;
	//获取略小于当前 pos 的绝对值和的 n
	while (getSum(n)>pos)
	{
		n--;
	}
	//求得小于当前绝对值之和的前面的点集数目之和
	long long sum = getSum(n);
	long long diff = pos - sum;
	n = n + 1;
	//此时说明点位于所求绝对值之和的前一个值,也就是之前和的最大值
	if (diff == 0)
	{
		return pair<long long, long long>(n - 1, 0);
	}
	else if (diff == 1)
	{
		return pair<long long, long long>(-n, 0);
	}
	else if (diff < 2 * n)
	{
		long long l = -(n - diff / 2);
		long long r = diff % 2 == 0 ? -diff / 2 : diff / 2;
		return pair<long long, long long>(l, r);
	}
	else if (diff / 2 == n)
	{
		long long r = diff % 2 == 0 ? -n : n;
		return pair<long long, long long>(0, r);
	}
	else if (diff < 4 * n)
	{
		long long l = (diff - 2 * n) / 2;
		long long r = (diff - 2 * n) % 2 == 0 ? -(n - l) : n - l;
		return pair<long long, long long>(l, r);
	}
	else
	{
		return pair<long long, long long>(n, 0);
	}

}

int main()
{
	int n;
	cin >> n;
	long long num;
	
	for (int i = 0; i < n; i++)
	{
		cin >> num;
		pair<long long, long long> result = getPair(num);
		cout << result.first << " " << result.second << endl;
	}

	return 0;
}

Submission Info

Submission Time
Task B - n-th Points
User cyfcooler
Language C++ (G++ 4.6.4)
Score 0
Code Size 1753 Byte
Status CE

Compile Error

./Main.cpp: In function ‘std::pair<long long int, long long int> getPair(long long int)’:
./Main.cpp:16:80: error: ‘sqrt’ was not declared in this scope