求和(数学,等差数列)

求和
Time Limit: 1000 ms   Memory Limit: 64 MB
Total Submission: 64   Submission Accepted: 16
Description
对于正整数n,k,我们定义这样一个函数f,它满足如下规律
f(n,k=1)=-1+2-3+4-5+6...n
f(n,k=2)=-1-2+3+4-5-6...n
f(n,k=3)=-1-2-3+4+5+6...n
f(n,k=4)=-1-2-3-4+5+6+7+8...n
现在给出n和k,你的任务就是要计算f(n,k)的值。

Input
首先是一个整数T,表示有T组数据
接下来每组数据是n和k(1<=n,k<=100000000)

Output
打印出f(n,k)的值,每个输出单独占一行

Sample Input
Original Transformed
3
1 1
2 1
3 1

Sample Output
Original Transformed
-1
1
-2

Source
安徽省2015年“京胜杯”大学生程序设计竞赛


注意几点?1.数据大,用long long 2.数据大,用等差数列求和

 

比较合适!

 

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    long long n,sum,x,y,a,b,i,z;
    scanf("%lld",&n);
    while(n--)
    {
        sum=0;
        scanf("%lld%lld",&a,&b);
        x=a/(b*2);//有几组?
        y=a%(b*2);//余数
        sum+=b*b*x;//加上每组的数!
        //cout<<"x="<<x<<"y="<<y<<" "<<sum<<endl;
       /* for(i=x*b*2+1;i<=a;i++)
        {
            if(i-x*b*2<=b)
            {
                sum-=i;
            }
            else
            {
                sum+=i;
            }
        }*/
        if(y<=b)
        {
            sum-=((x*b*2+1+x*b*2+y)*y)/2;
        }
        else
        {
            z=b-y;
            sum-=((x*b*2+1+x*b*2+b)*b)/2;
            sum+=((x*b*2+b+1+a)*(a-x*b*2-b))/2;
        }
        printf("%lld\n",sum);
    }
}
/*
11
100000000 25896333
*/


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值