简单求和

来源:互联网 发布:淘宝的被子能买吗 编辑:程序博客网 时间:2024/05/17 09:00

Description

小Kevin从没有听说过单词“无限”。于是他请导师给他解释这个词。他的导师知道“无限”是一个非常大的数。为了展示无限可能有多大, 他的导师给了他一个挑战: 求从1到 N的数的和。和数开始变得非常大,并且已经超出了“long long int”的表示范围。于是,这一课非常清晰。

现在,他的导师引入了取余的概念并让他只保留余数而非巨大的数。 然后, 导师给了他一个计算的公式:

Input

第一行包含 T, 测试数据的组数。 后跟 T行,每行包含2个空白分隔的整数N m
1 ≤ T ≤ 1000
1 ≤ N ≤ 10^9
1 ≤ m ≤ 10^9

(⊙﹏⊙)

对每组测试数据,输出一行包含一个结果。

Sample Input

3
10 5
10 3
5 5

Sample Output

20
10
10

Hint

测试数据1: N = 10 m = 5,
1%5 + 2%5 + 3%5 + 4%5 + 5%5 + 6%5 + 7%5 + 8%5 + 9%5 + 10%5 = 20.
测试数据2和3可以类似解释。

题意

题解:

把n分为1~m和m~n

AC代码

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;int main(){    int t;    scanf("%d",&t);    for (int i = 0; i < t; ++i){        ll n,m;        scanf("%lld%lld",&n,&m);        ll t1 = n/m;        ll t2 = n%m;        ll ans1 = t1*m*(m-1)/2;        ll ans2 = t2*(t2+1)/2;        ll ans = ans1+ans2;        printf("%lld\n",ans);    }return 0;}