Tricky Sum(等比数列)
2016-03-12 18:36
459 查看
Tricky Sum
Crawling in process...Crawling failedTime
Limit:1000MS Memory Limit:262144KB
64bit IO Format:%I64d & %I64u
SubmitStatus
Practice
CodeForces 598A
Description
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 are20,
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 ofn to be processed.
Each of next t lines contains a single integern (1 ≤ n ≤ 109).
Output
Print the requested sum for each of t integersn given in the input.
Sample Input
Input
Output
Sample Output
302000
Hint
The answer for the first sample is explained in the statement.
求前n个数的和,1-------n;(其中等于2^m(m=0、1、2、。。。。。)都为负数,其余数都为负数。
2的所有次方和:s=2^(t+1)-1(等比数列求和且2^t<n)
h=1+2+3+4+……+n=n(n+1)/2
最后结果:
ans=h-2*t;
My solution:
/*2016.3.12*/
Crawling in process...Crawling failedTime
Limit:1000MS Memory Limit:262144KB
64bit IO Format:%I64d & %I64u
SubmitStatus
Practice
CodeForces 598A
Description
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 are20,
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 ofn to be processed.
Each of next t lines contains a single integern (1 ≤ n ≤ 109).
Output
Print the requested sum for each of t integersn given in the input.
Sample Input
Input
2 4 1000000000
Output
-4 499999998352516354
Sample Output
302000
Hint
The answer for the first sample is explained in the statement.
求前n个数的和,1-------n;(其中等于2^m(m=0、1、2、。。。。。)都为负数,其余数都为负数。
2的所有次方和:s=2^(t+1)-1(等比数列求和且2^t<n)
h=1+2+3+4+……+n=n(n+1)/2
最后结果:
ans=h-2*t;
My solution:
/*2016.3.12*/
<pre name="code" class="cpp">#include<stdio.h> long long n; long long ans,su; void jie() { int i,t1=0; long long time=2; ans=1; while(ans<=n) { t1++; ans*=2; } i=t1; ans=1; while(i) { if(i%2) ans*=time; i/=2; time*=time; } return ; } int main() { long long i; int t; scanf("%d",&t); while(t--) { scanf("%I64d",&n); jie(); if(n%2==0) su=(n/2)*(n+1); else su=((n+1)/2)*n; su=su-2*(ans-1); printf("%I64d\n",su); } return 0; }
相关文章推荐
- Mysql数据库备份与还原语法。
- 10.C进阶之变量和常量
- 抽象类和接口
- 用网页server实现钢琴弹奏(使用Wizwiki-W7500)
- 每周收获。
- 简单复利计算c语言实现
- [RxJS] Refactoring CombineLatest to WithLatestFrom
- Python version 3.4 required, which was not found in the registry
- Java工程师成神之路
- html5基础知识介绍
- C语言复习
- 记录一下今天碰到的一个问题
- hdu3836 Equivalent Sets
- 单利计算与复利计算程序
- 第一次作业
- 软件工程第二周学习进度条
- JSP学习总结-servlet
- ubuntu14.04 无线上网问题
- 第2周项目4 用循环求圆周率
- yii2数据修改|联查