ACM程序设计选修课——1051: Glamor Sequence(YY+求和公式)
来源:互联网 发布:儿童编程培训 价格 编辑:程序博客网 时间:2024/05/17 10:42
1051: Glamor Sequence
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 16 Solved: 5
[Submit][Status][Web Board]
Description
you have a sequence +1, +2, +3, ... +m, -(m + 1), -(m + 2), ..., -(2m), (2m + 1), (2m + 2), ..., (3m), .....
and you need calculator sum of the first n items.
Input
For each test case, there is a line contains two integers n and m, (1 <= m <= n <= 1000000000).
Output
For each test case, print sum of the first n items.
Sample Input
8 210 3
Sample Output
-85
HINT
For the first sample, the sequence is 1, 2, -3, -4, 5, 6, -7, -8, so the answer is -8.
For the second sample, the sequence is 1, 2, 3, -4, -5, -6, 7, 8, 9, -10, so the answer is 5.
想了很久还是不会。问了同学大概思路,确是用等差数列求和公式,但是先前的做法效率比较低,用了for循环,一旦出现n比较大而m非常小的话就会超时,比如n=1000000000,m=1,test测试一下5秒多。
因此一种思路是这样:
可以发现从1开始前2*m项的和的绝对值是一个常数即m,e=n-n%(2*m)那么只需处理后面e+1~n的数字即可。因此可以有如下规律
设剩下的区间为e+1~n(也可能是e+m)。
1、若e+m<=n——即数轴分布情况为e+1~e+m~n。只需将之前的所有完整段的和加上Sum[e+1,e+m]即可,且每一项都是正数。
2、若e+m>n——即数轴分布情况为e+1~n~e+m。那么要计算S1[e+1,n]与S2[n+1,e+m],ans=ans+S1-S2。
#include<iostream> #include<string> #include<algorithm> using namespace std; int main(void) { long long n,m,e; long long ans; while (~scanf("%lld%lld",&n,&m)) { e=n-n%(2*m); ans=(e)*(-m)/2;//所有完整段求和 if(e+m<n)//分类讨论 { ans=ans+(2*e+1+m)*m/2; ans=ans-(e+m+1+n)*(n-e-m)/2; } else if(e+m>n) { ans=ans+(e+1+n)*(n-e)/2; } else { ans=ans+(2*e+1+m)*m/2; } printf("%lld\n",ans);//这题要用long long来储存答案 } return 0; }
- ACM程序设计选修课——1051: Glamor Sequence(YY+求和公式)
- ACM程序设计选修课——1058: Lucky Sequence(思考)
- ACM程序设计选修课——1043: Radical loves integer sequences(YY)
- ACM程序设计选修课——1036: Hungar的菜鸟赛季(YY)
- ACM程序设计选修课——1040: Alex and Asd fight for two pieces of cake(YY+GCD)
- ACM程序设计选修课——1049: Efface Numbers(贪心)
- ACM程序设计选修课——1081: 堆(BFS)
- ACM程序设计选修课——1018: Common Subsequence
- ACM程序设计选修课——1030: Hungar的时尚球场(水题+耐心)
- ACM程序设计选修课——1044: (ds:队列)打印队列(queue模拟)
- ACM程序设计选修课——1065: Operations on Grids(暴力字符串)
- ACM程序设计选修课——1057: Beautiful Garden(模拟+耐心调试)
- ACM程序设计选修课——1076汇编语言(重定向+模拟)
- ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)
- ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
- ACM程序设计选修课——1024: 末位零(求末尾0的方法+可有可无的快速幂)
- ACM程序设计选修课——1031: Hungar的得分问题(二)(杨辉三角+二进制转换)
- 01背包,完全背包
- Mysql To Charts(二)--相关知识点
- 「学习笔记」3.25代码学习
- HttpEntity转为List<JavaBean>
- ThinkPHP page添加分页参数
- ACM程序设计选修课——1051: Glamor Sequence(YY+求和公式)
- 虚函数与纯虚函数
- ICP算法博客辑录
- 数据库建立
- <meta>标签用法
- IAR之扩展关键字
- Bzoj:[ZJOI2010]network 网络扩容:网络流,最大流+费用流
- Linux下对带空格的文件进行处理
- [LeetCode]Palindrome Pairs