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 1
3
1 1
2 1
3 1
Sample Output 1
-1
1
-2
思路
求和,根据规律,不考虑符号的情况下,这是给公差为1的等差数列
那么计算上则采取求和公式计算,因为有符号,所以需要考虑分块计算
易知每块数字的个数为k,符号这里用设置一个初始值为-1的direction,每计算一块,就使direction=0-direction,将没有符号的块和乘以direction便是加上符号后的块和
终止条件,当剩余数字不满足一个k时,但大于零时
需要另外计算,方法类似,只是数字的个数不再是k了
注意数据开long long
#include <iostream>
using namespace std;
int main()
{
long long T;
cin >> T;
while (T--) {
long long n, k;
cin >> n >> k;
int direction = -1;
long long sum = 0;
long long Tsum;
long long i;
for ( i =1; i +k<= n; i += k) {
Tsum = (i + (i + k - 1)) * k / 2;
sum += Tsum * direction;
direction = 0 - direction;
}
if (n-i< k&&n-i>=0) {
Tsum = (i + n) * (n - i+ 1) / 2;
sum += Tsum * direction;
}
cout << sum << endl;
}
return 0;
}