LightOJ 1294

来源:互联网 发布:淘宝买家问质量怎么样 编辑:程序博客网 时间:2024/06/02 05:17

Positive Negative Sign

F - Positive Negative Sign

Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

Description

Given two integers: n and m and n is divisible by 2m, you have to write down the first n natural numbers in the following form. At first take first mintegers and make their sign negative, then take next m integers and make their sign positive, the next m integers should have negative signs and continue this procedure until all the n integers have been assigned a sign. For example, let n be 12 and m be 3. Then we have

-1 -2 -3 +4 +5 +6 -7 -8 -9 +10 +11 +12

If n = 4 and m = 1, then we have

-1 +2 -3 +4

Now your task is to find the summation of the numbers considering their signs.

Input

Input starts with an integer T (≤ 10000), denoting the number of test cases.

Each case starts with a line containing two integers: n and m (2 ≤ n ≤ 109, 1 ≤ m). And you can assume that n is divisible by 2*m.

Output

For each case, print the case number and the summation.

Sample Input

2

12 3

4 1

Sample Output

Case 1: 18

Case 2: 2

做好几次了,每次都是for循环超时,不长记性

题解:

找规律,eg1:-1-2-3+4+5+6为一组,即每2*m个数为一组,和为m*m,共两组,n/2*m组,所以结果为m*n/2;

代码:

#include<cstdio>using namespace std;int main(){int t,cas=1;long long a,b;scanf ("%d",&t);while (t--){scanf ("%lld %lld",&a,&b);printf ("Case %d: %lld\n",cas++,a/2*b);} return 0;}

笑哭。。。。

TLE代码

#include<cstdio>using namespace std;int main(){int t,n,m,cas=1;;long long ans,sum;scanf ("%d",&t);while (t--){ans=0;sum=0;scanf ("%d %d",&n,&m);ans=n*(n+1)/2;for (int i=1;i<=n;i+=2*m){sum+=m*i+m*(m-1)/2;}printf ("Case %d: %lld\n",cas++,ans-2*sum);}return 0;} 


0 0
原创粉丝点击