首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【CodeForces 598A】Tricky Sum(计数)

【CodeForces 598A】Tricky Sum(计数)

作者头像
FishWang
发布2025-08-27 08:49:40
发布2025-08-27 08:49:40
11100
代码可运行
举报
运行总次数:0
代码可运行

点击打开题目

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 1, 2 and 4 are 20, 21 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

代码语言:javascript
代码运行次数:0
运行
复制
2
4
1000000000

output

代码语言:javascript
代码运行次数:0
运行
复制
-4
499999998352516354

Note

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

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

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档