CodeForces - 598A Tricky Sum (快速幂)
2016-03-12 13:38
399 查看
CodeForces
- 598A
Tricky Sum
Submit Status
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 are 20, 21 and 22respectively.
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 Input
Input
Output
Hint
The answer for the first sample is explained in the statement.
//题意:
先输入一个T,表示有几组输入,再输入一个n,表示要计算n的和sum。
计算规则为,从1---n这n个数中任意一个数m,如果m这个数是2的次方的话,sum+=(-m),否则sum+=m。
//思路:
以为数比较大,所以先求出总的和sum,再用快速幂,求出所有是2的次方的数的和num,最后求差即可sum=sum-2*num。
- 598A
Tricky Sum
Time Limit: 1000MS | Memory Limit: 262144KB | 64bit IO Format: %I64d & %I64u |
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 are 20, 21 and 22respectively.
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 Input
Input
2 4 1000000000
Output
-4 499999998352516354
Hint
The answer for the first sample is explained in the statement.
//题意:
先输入一个T,表示有几组输入,再输入一个n,表示要计算n的和sum。
计算规则为,从1---n这n个数中任意一个数m,如果m这个数是2的次方的话,sum+=(-m),否则sum+=m。
//思路:
以为数比较大,所以先求出总的和sum,再用快速幂,求出所有是2的次方的数的和num,最后求差即可sum=sum-2*num。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #define INF 0x3f3f3f3f #define ll long long #define ull unsigned long long #define IN __int64 #define N 10010 #define M 1000000007 #define PI acos(-1.0) using namespace std; ull kp(int n,int k) { ull s=1; while(k) { if(k&1) s*=n; n*=n; k/=2; } return s; } int main() { int t; scanf("%d",&t); while(t--) { IN n; cin>>n; IN sum=((n*(n+1))/2); IN num=0; int k=0; while(1) { int m=kp(2,k); if(m<=n) { num=num+(IN)m; k++; } else break; } sum=(sum-num*2); printf("%I64d\n",sum); } return 0; }
相关文章推荐
- 关于java开发技巧
- Backbone源码分析-Backbone架构+流程图
- SPRING循环依赖(circular reference)的解决方法
- 欢迎使用CSDN-markdown编辑器
- spring security执行流程图
- 面试题3 ----二维数组中的查找
- 重复登录Windows远程桌面-Autoit脚本
- 【红宝书笔记】一点关于JS的垃圾回收机制
- Python Multinomial Logistics 实现MNIST分类
- 浅谈ThreadLocal
- 一种虚拟机软件更新方法
- JAVA内置数据结构概述
- JAVA内置数据结构概述
- JAVA内置数据结构概述
- JAVA内置数据结构概述
- JAVA内置数据结构概述
- JAVA内置数据结构概述
- JAVA内置数据结构概述
- JAVA内置数据结构概述
- Android View体系(五)从源码解析View的事件分发机制