【CodeForces 598A】Tricky Sum(计数)

A. Tricky Sum
time limit per test
 1 second
memory limit per test
 256 megabytes
input
 standard input
output
 standard output

In this problem you are to calculate the sum of all integers from 1 to n, but you should take all powers of two with minus in the sum.

For example, for n = 4 the sum is equal to  - 1 - 2 + 3 - 4 =  - 4, because 12 and 4 are 2021 and 22 respectively.

Calculate the answer for t values of n.

Input

The first line of the input contains a single integer t (1 ≤ t ≤ 100) — the number of values of n to be processed.

Each of next t lines contains a single integer n (1 ≤ n ≤ 109).

Output

Print the requested sum for each of t integers n given in the input.

Sample test(s)
input
2
4
1000000000
output
-4
499999998352516354
Note

The answer for the first sample is explained in the statement.




计算出 sum(1,m) 减去等比数列的和(1为首项2为公比)的2倍就行了。

代码如下:

#include <cstdio>
int main()
{
	int u;
	__int64 ans;
	__int64 n;
	scanf ("%d",&u);
	while (u--)
	{
		ans = 0;
		scanf ("%I64d",&n);
		__int64 t = n;
		__int64 sum = 1;
		int num = 0;
		while (t)
		{
			num++;
			t >>= 1;
		}
		num--;
		sum = (sum <<= num + 1) - 1;		//2的等比数列和
		__int64 mid = n / 2;
		ans = (1 + mid) * mid /2;
		ans -= sum;
		ans += (mid + 1 + n) * (n - mid) / 2;
		ans -= sum;
		printf ("%I64d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(【CodeForces 598A】Tricky Sum(计数))